You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

softmax_ce.py 5.4 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. # -*- coding: utf-8 -*-
  2. # ---
  3. # jupyter:
  4. # jupytext_format_version: '1.2'
  5. # kernelspec:
  6. # display_name: Python 3
  7. # language: python
  8. # name: python3
  9. # language_info:
  10. # codemirror_mode:
  11. # name: ipython
  12. # version: 3
  13. # file_extension: .py
  14. # mimetype: text/x-python
  15. # name: python
  16. # nbconvert_exporter: python
  17. # pygments_lexer: ipython3
  18. # version: 3.5.2
  19. # ---
  20. # # Softmax & 交叉熵代价函数
  21. #
  22. # softmax经常被添加在分类任务的神经网络中的输出层,神经网络的反向传播中关键的步骤就是求导,从这个过程也可以更深刻地理解反向传播的过程,还可以对梯度传播的问题有更多的思考。
  23. #
  24. # ## softmax 函数
  25. #
  26. # softmax(柔性最大值)函数,一般在神经网络中, softmax可以作为分类任务的输出层。其实可以认为softmax输出的是几个类别选择的概率,比如我有一个分类任务,要分为三个类,softmax函数可以根据它们相对的大小,输出三个类别选取的概率,并且概率和为1。
  27. #
  28. # softmax函数的公式是这种形式:
  29. #
  30. # $$
  31. # S_i = \frac{e^{z_i}}{\sum_k e^{z_k}}
  32. # $$
  33. #
  34. # * $S_i$是经过softmax的类别概率输出
  35. # * $z_k$是神经元的输出
  36. #
  37. #
  38. # 更形象的如下图表示:
  39. #
  40. # ![softmax_demo](images/softmax_demo.png)
  41. #
  42. # softmax直白来说就是将原来输出是$[3,1,-3]$通过softmax函数一作用,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标!
  43. #
  44. #
  45. #
  46. # 首先是神经元的输出,一个神经元如下图:
  47. #
  48. # ![softmax_neuron](images/softmax_neuron.png)
  49. #
  50. # 神经元的输出设为:
  51. #
  52. # $$
  53. # z_i = \sum_{j} w_{ij} x_{j} + b
  54. # $$
  55. #
  56. # 其中$W_{ij}$是第$i$个神经元的第$j$个权重,$b$是偏置。$z_i$表示该网络的第$i$个输出。
  57. #
  58. # 给这个输出加上一个softmax函数,那就变成了这样:
  59. #
  60. # $$
  61. # a_i = \frac{e^{z_i}}{\sum_k e^{z_k}}
  62. # $$
  63. #
  64. # $a_i$代表softmax的第$i$个输出值,右侧套用了softmax函数。
  65. #
  66. #
  67. # ### 损失函数 loss function
  68. #
  69. # 在神经网络反向传播中,要求一个损失函数,这个损失函数其实表示的是真实值与网络的估计值的误差,知道误差了,才能知道怎样去修改网络中的权重。
  70. #
  71. # 损失函数可以有很多形式,这里用的是交叉熵函数,主要是由于这个求导结果比较简单,易于计算,并且交叉熵解决某些损失函数学习缓慢的问题。**[交叉熵函数](https://blog.csdn.net/u014313009/article/details/51043064)**是这样的:
  72. #
  73. # $$
  74. # C = - \sum_i y_i ln a_i
  75. # $$
  76. #
  77. # 其中$y_i$表示真实的分类结果。
  78. #
  79. #
  80. # ## 推导过程
  81. #
  82. # 首先,我们要明确一下我们要求什么,我们要求的是我们的$loss$对于神经元输出($z_i$)的梯度,即:
  83. #
  84. # $$
  85. # \frac{\partial C}{\partial z_i}
  86. # $$
  87. #
  88. # 根据复合函数求导法则:
  89. #
  90. # $$
  91. # \frac{\partial C}{\partial z_i} = \frac{\partial C}{\partial a_j} \frac{\partial a_j}{\partial z_i}
  92. # $$
  93. #
  94. # 有个人可能有疑问了,这里为什么是$a_j$而不是$a_i$,这里要看一下$softmax$的公式了,因为$softmax$公式的特性,它的分母包含了所有神经元的输出,所以,对于不等于i的其他输出里面,也包含着$z_i$,所有的$a$都要纳入到计算范围中,并且后面的计算可以看到需要分为$i = j$和$i \ne j$两种情况求导。
  95. #
  96. # ### 针对$a_j$的偏导
  97. #
  98. # $$
  99. # \frac{\partial C}{\partial a_j} = \frac{(\partial -\sum_j y_j ln a_j)}{\partial a_j} = -\sum_j y_j \frac{1}{a_j}
  100. # $$
  101. #
  102. # ### 针对$z_i$的偏导
  103. #
  104. # 如果 $i=j$ :
  105. #
  106. # \begin{eqnarray}
  107. # \frac{\partial a_i}{\partial z_i} & = & \frac{\partial (\frac{e^{z_i}}{\sum_k e^{z_k}})}{\partial z_i} \\
  108. # & = & \frac{\sum_k e^{z_k} e^{z_i} - (e^{z_i})^2}{\sum_k (e^{z_k})^2} \\
  109. # & = & (\frac{e^{z_i}}{\sum_k e^{z_k}} ) (1 - \frac{e^{z_i}}{\sum_k e^{z_k}} ) \\
  110. # & = & a_i (1 - a_i)
  111. # \end{eqnarray}
  112. #
  113. # 如果 $i \ne j$:
  114. # \begin{eqnarray}
  115. # \frac{\partial a_j}{\partial z_i} & = & \frac{\partial (\frac{e^{z_j}}{\sum_k e^{z_k}})}{\partial z_i} \\
  116. # & = & \frac{0 \cdot \sum_k e^{z_k} - e^{z_j} \cdot e^{z_i} }{(\sum_k e^{z_k})^2} \\
  117. # & = & - \frac{e^{z_j}}{\sum_k e^{z_k}} \cdot \frac{e^{z_i}}{\sum_k e^{z_k}} \\
  118. # & = & -a_j a_i
  119. # \end{eqnarray}
  120. #
  121. # 当u,v都是变量的函数时的导数推导公式:
  122. # $$
  123. # (\frac{u}{v})' = \frac{u'v - uv'}{v^2}
  124. # $$
  125. #
  126. # ### 整体的推导
  127. #
  128. # \begin{eqnarray}
  129. # \frac{\partial C}{\partial z_i} & = & (-\sum_j y_j \frac{1}{a_j} ) \frac{\partial a_j}{\partial z_i} \\
  130. # & = & - \frac{y_i}{a_i} a_i ( 1 - a_i) + \sum_{j \ne i} \frac{y_j}{a_j} a_i a_j \\
  131. # & = & -y_i + y_i a_i + \sum_{j \ne i} y_j a_i \\
  132. # & = & -y_i + a_i \sum_{j} y_j
  133. # \end{eqnarray}
  134. # ## 问题
  135. # 如何将本节所讲的softmax,交叉熵代价函数应用到上节所讲的方法中?
  136. # ## References
  137. #
  138. # * Softmax & 交叉熵
  139. # * [交叉熵代价函数(作用及公式推导)](https://blog.csdn.net/u014313009/article/details/51043064)
  140. # * [手打例子一步一步带你看懂softmax函数以及相关求导过程](https://www.jianshu.com/p/ffa51250ba2e)
  141. # * [简单易懂的softmax交叉熵损失函数求导](https://www.jianshu.com/p/c02a1fbffad6)

机器学习越来越多应用到飞行器、机器人等领域,其目的是利用计算机实现类似人类的智能,从而实现装备的智能化与无人化。本课程旨在引导学生掌握机器学习的基本知识、典型方法与技术,通过具体的应用案例激发学生对该学科的兴趣,鼓励学生能够从人工智能的角度来分析、解决飞行器、机器人所面临的问题和挑战。本课程主要内容包括Python编程基础,机器学习模型,无监督学习、监督学习、深度学习基础知识与实现,并学习如何利用机器学习解决实际问题,从而全面提升自我的《综合能力》。