Machine Learning
  • Introduction
  • 机器学习
    • 前言
      • 符号表
    • 监督式学习
      • 感知机
        • 感知机模型
        • 感知机学习算法
        • 算法python实现
      • Logistic回归
        • Logistic分布
        • Logistic回归模型
        • 算法python实现
      • 线性回归
        • 线性回归模型
        • 算法python实现
      • K近邻法
        • k近邻模型
        • kd树方法
        • kd树python实现
        • knn实例
      • 朴素贝叶斯法
        • 模型和原理
        • 参数估计
        • 算法和实现
      • 决策树
        • 模型与学习
        • 特征选择
        • 生成算法和剪枝
        • python实现
      • 支持向量机
    • 神经网络
      • 神经元模型和感知机
      • 神经网络
      • 神经网络的矩阵表达
      • 反向传播算法
        • 算法证明
        • 算法代码
        • 基于矩阵的计算
      • 改进神经网络的学习方法
        • 交叉熵代价函数
        • softmax
        • regularization
        • 权重初始化
      • 卷积神经网络
        • 基本介绍
    • 数学基础
      • 线性代数
        • 特征值和特征向量
      • 概率统计
        • 随机变量的特征
        • 样本统计量
        • 先验后验概率
      • 微积分
        • 向量内积
        • 方向导数和梯度
        • 梯度下降法
      • 信息论
        • 熵
        • 相对熵和交叉熵
        • 条件熵
        • 互信息
Powered by GitBook
On this page
  • Softmax
  • 对数似然损失函数
  1. 机器学习
  2. 神经网络
  3. 改进神经网络的学习方法

softmax

Softmax

除了使用交叉熵来解决学习缓慢的问题外,还可以使用基于柔性最大值(softmax)神经元层。

柔性最大值的想法其实就是为神经网络定义一种新式的输出层。开始时和和S型层一样,首先计算带权输入

zjL=∑k(wjkLakL−1)+bjLz^L_j=\displaystyle\sum_{k}(w_{jk}^L a_k^{L-1}) + b_j^LzjL​=k∑​(wjkL​akL−1​)+bjL​

然后应用 softmax 函数在zjLz^L_jzjL​上,根据这个函数,第jjj个神经元的激活值就是

ajL=ezjL∑kezkLa^L_j = \frac{e^{z^L_j}}{\displaystyle\sum_{k}e^{z^L_k}}ajL​=k∑​ezkL​ezjL​​

其中分母的求和是在所有的输出神经元上进行的。而且所有输出的激活值加起来正好为1,同样保证输出激活值都是正数。而且柔性最大值层的输出可以被看做是一个概率分布。

下面计算ajLa^L_jajL​对ziLz_i^LziL​的导数

如果j=ij=ij=i:

∂ajL∂ziL=∂∂ziL(ezjL∑kezkL)\frac{\partial a_j^L}{\partial z_i^L} = \frac{\partial }{\partial z_i^L}(\frac{e^{z^L_j}}{\displaystyle\sum_{k}e^{z^L_k}})∂ziL​∂ajL​​=∂ziL​∂​(k∑​ezkL​ezjL​​)
=(ezjL)′⋅∑kezkL−ezjL⋅ezjL(∑kezkL)2=\frac{(e^{z^L_j})'\cdot\displaystyle\sum_{k}e^{z^L_k} - e^{z^L_j}\cdot e^{z^L_j} }{(\displaystyle\sum_{k}e^{z^L_k})^2}=(k∑​ezkL​)2(ezjL​)′⋅k∑​ezkL​−ezjL​⋅ezjL​​
=ezjL∑kezkL−ezjL∑kezkL⋅ezjL∑kezkL=\frac{e^{z^L_j}}{\displaystyle\sum_{k}e^{z^L_k}}-\frac{e^{z^L_j}}{\displaystyle\sum_{k}e^{z^L_k}} \cdot \frac{e^{z^L_j}}{\displaystyle\sum_{k}e^{z^L_k}}=k∑​ezkL​ezjL​​−k∑​ezkL​ezjL​​⋅k∑​ezkL​ezjL​​
=aj(1−aj)=a_j (1-a_j)=aj​(1−aj​)

如果j≠ij \neq ij=i:

∂ajL∂ziL=∂∂ziL(ezjL∑kezkL)\frac{\partial a_j^L}{\partial z_i^L}=\frac{\partial }{\partial z_i^L}(\frac{e^{z^L_j}}{\displaystyle\sum_{k}e^{z^L_k}})∂ziL​∂ajL​​=∂ziL​∂​(k∑​ezkL​ezjL​​)
=0⋅∑kezkL−ezjL⋅eziL(∑kezkL)2=\frac{0\cdot\displaystyle\sum_{k}e^{z^L_k} - e^{z^L_j}\cdot e^{z^L_i} }{(\displaystyle\sum_{k}e^{z^L_k})^2}=(k∑​ezkL​)20⋅k∑​ezkL​−ezjL​⋅eziL​​
=−ezjL∑kezkL⋅eziL∑kezkL=-\frac{e^{z^L_j}}{\displaystyle\sum_{k}e^{z^L_k}} \cdot \frac{e^{z^L_i}}{\displaystyle\sum_{k}e^{z^L_k}}=−k∑​ezkL​ezjL​​⋅k∑​ezkL​eziL​​
=−ajai= - a_j a_i=−aj​ai​

对数似然损失函数

其对数似然损失函数为:

C=−∑kyklogakC=-\displaystyle\sum_{k}y_k \mathrm{log}a_kC=−k∑​yk​logak​

其中aka_kak​为第kkk个神经元的输出值,yky_kyk​表示第kkk个神经元的真实值,取值为000或111。

这个代价的简单含义是:只有一个神经元对应了该样本的正确分类,若这个神经元的输出概率越高,则其产出的代价越小,反之则代价越高。

则计算损失函数对权重和偏置的偏导数:

∂C∂bjL=∂C∂zjL⋅∂zjL∂bjL\frac{\partial C}{\partial b_j^L} = \frac{\partial C }{\partial z_j^L}\cdot \frac{\partial z_j^L }{\partial b_j^L}∂bjL​∂C​=∂zjL​∂C​⋅∂bjL​∂zjL​​
=∂C∂zjL⋅∂∑k(wjkLakL−1)+bjL∂bjL=∂C∂zjL= \frac{\partial C }{\partial z_j^L}\cdot \frac{\partial \displaystyle\sum_{k}(w_{jk}^L a_k^{L-1}) + b_j^L }{\partial b_j^L} = \frac{\partial C }{\partial z_j^L}=∂zjL​∂C​⋅∂bjL​∂k∑​(wjkL​akL−1​)+bjL​​=∂zjL​∂C​
=∂∂zjL(−∑kyklogakL)= \frac{\partial}{\partial z_j^L}( -\displaystyle\sum_{k}y_k \mathrm{log}a_k^L )=∂zjL​∂​(−k∑​yk​logakL​)
=−∑kyk⋅1akL⋅∂akL∂zjL=-\displaystyle\sum_{k}y_k \cdot \frac{1 }{a_k^L} \cdot \frac{\partial a_k^L}{\partial z_j^L}=−k∑​yk​⋅akL​1​⋅∂zjL​∂akL​​
=−yj⋅1ajL⋅∂ajL∂zjL−∑k≠jyk⋅1akL⋅∂akL∂zjL=-y_j \cdot \frac{1 }{a_j^L} \cdot \frac{\partial a_j^L}{\partial z_j^L}-\displaystyle\sum_{k \neq j}y_k \cdot \frac{1 }{a_k^L} \cdot \frac{\partial a_k^L}{\partial z_j^L}=−yj​⋅ajL​1​⋅∂zjL​∂ajL​​−k=j∑​yk​⋅akL​1​⋅∂zjL​∂akL​​
=−yj⋅1ajL⋅ajL(1−ajL)−∑k≠jyk⋅1akL⋅−ajLakL=-y_j \cdot \frac{1 }{a_j^L} \cdot a_j^L (1-a_j^L)-\displaystyle\sum_{k \neq j}y_k \cdot \frac{1 }{a_k^L} \cdot -a_j^L a_k^L=−yj​⋅ajL​1​⋅ajL​(1−ajL​)−k=j∑​yk​⋅akL​1​⋅−ajL​akL​
=−yj+yjajL+∑k≠jyk⋅ajL=-y_j + y_j a_j^L +\displaystyle\sum_{k \neq j}y_k \cdot a_j^L=−yj​+yj​ajL​+k=j∑​yk​⋅ajL​
=ajL−yj=a_j^L-y_j=ajL​−yj​

同样可得:

∂C∂wjk=aL−1(ajL−yj)\frac{\partial C}{\partial w_{jk}}=a^{L-1}(a_j^L-y_j)∂wjk​∂C​=aL−1(ajL​−yj​)

因此可以确保不会遇到学习缓慢的问题。事实上把一个具有对数似然代价的柔性最大值输出层,看作与一个具有交叉熵代价函数的S型输出层非常相似。在很多应用场景中,这两种方式的效果都不错。

Previous交叉熵代价函数Nextregularization

Last updated 6 years ago

参考:

https://blog.csdn.net/niuniuyuh/article/details/61926561