机器学习05-神经网络学习


文章目录

  • 代价函数
    • 符号定义
    • 代价函数
    • 补充:神经网络的模型表示
  • 反向传播算法
  • 理解反向传播算法
  • 梯度检测
  • 随机初始化
  • 组和到一起
    • 神经网络中的梯度下降算法

代价函数 符号定义 假设我们有一个下图所示的神经网络
  • 该网络有 m 个训练集{ ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) , . . . , ( x ( m ) , y ( m ) ) } \{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})\} {(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))}
  • L 表示该网络的层数,图中 L = 4
  • s l s_l sl? 表第 l 层的神经元数目, s 1 = 3 , s 2 = s 3 = 5 , s 4 = s l = 4 s_1=3, s_2 = s_3 = 5, s_4 = s_l = 4 s1?=3,s2?=s3?=5,s4?=sl?=4
    机器学习05-神经网络学习
    文章图片
对于神经网络,考虑二分类和一对多两种情况:
  • 对于二分类, y = 0o r1 y = 0 ~or~ 1 y=0 or 1,只需要一个输出单元即可,即s l = 1 s_l = 1 sl?=1
  • 对于一对多, y ∈ R K y \in \mathcal R^K y∈RK,例如[ 1 0 0 0 ] \begin{bmatrix} 1\\ 0\\ 0\\ 0 \end{bmatrix} ?????1000??????, [ 0 1 0 0 ] \begin{bmatrix} 0\\ 1\\ 0\\ 0 \end{bmatrix} ?????0100??????, [ 0 0 1 0 ] \begin{bmatrix} 0\\ 0\\ 1\\ 0 \end{bmatrix} ?????0010??????, [ 0 0 0 1 ] \begin{bmatrix} 0\\ 0\\ 0\\ 1 \end{bmatrix} ?????0001??????,需要 K 个输出单元, s l = k( k ≥ 3 , k = 1o r2 时 只 需 一 个 输 出 单 元 ) s_l = k ~~(k \geq 3,k=1~or~2时只需一个输出单元) sl?=k(k≥3,k=1 or 2时只需一个输出单元)。
代价函数 在二分类的逻辑函数中,我们定义代价函数为:
J ( θ ) = ? 1 m ∑ i = 1 m [ y ( i ) l o g ( h θ ( x ( i ) ) ) + ( 1 ? y ( i ) ) l o g ( 1 ? h θ ( x ( i ) ) ) ] + λ 2 m ∑ j = 1 n θ j 2 J(\theta) = -\frac{1}{m} \sum_{i=1}^m [y^{(i)}log(h_\theta(x^{(i)})) + (1-y^{(i)})log(1 - h_\theta(x^{(i)}))] + \frac{\lambda}{2m} \sum_{j=1}^n\theta_j^2 J(θ)=?m1?i=1∑m?[y(i)log(hθ?(x(i)))+(1?y(i))log(1?hθ?(x(i)))]+2mλ?j=1∑n?θj2?
对于一对多问题 h θ ( x ) ∈ R K h_\theta(x) \in \mathcal R^K hθ?(x)∈RK,我们定义代价函数为:
J ( θ ) = ? 1 m [ ∑ i = 1 m ∑ k = 1 K y k ( i ) l o g ( h θ ( x ( i ) ) ) k + ( 1 ? y k ( i ) ) l o g ( 1 ? ( h θ ( x ( i ) ) ) ) k ] + λ 2 m ∑ l = 1 L ? 1 ∑ i = 1 s l ∑ j = 1 s l + 1 ( θ j i ( i ) ) 2 J(\theta) = -\frac{1}{m}[\sum_{i=1}^m\sum_{k=1}^Ky_k^{(i)}log(h_\theta(x^{(i)}))_k + (1 - y^{(i)}_k)log(1 - (h_\theta(x^{(i)})))_k] + \frac{\lambda}{2m}\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_{l+1}}(\theta_{ji}^{(i)})^2 J(θ)=?m1?[i=1∑m?k=1∑K?yk(i)?log(hθ?(x(i)))k?+(1?yk(i)?)log(1?(hθ?(x(i))))k?]+2mλ?l=1∑L?1?i=1∑sl??j=1∑sl+1??(θji(i)?)2
其中h θ ( x ) i h_\theta(x)_i hθ?(x)i? 表示第 i 个输出
上式的第二项类似于逻辑回归中的正则化项,由于我们不对偏差项(即 i = 0 的项)进行正则化,故 i 从 1 开始取值。
补充:神经网络的模型表示 我们引入一些符号来描述模型:
  • a i ( j ) a_i^{(j)} ai(j)? 表示第 j 层的第 i 个激活单元
  • θ ( j ) \theta^{(j)} θ(j) 代表从第 j 层映射到第 j+1 层时的权重的矩阵,例如代表从第一层映射到第二层的权重的矩阵。其尺寸为:以第 j+1 层的激活单元数量为行数,以第 j 层的激活单元数加一为列数的矩阵。例如:上图所示的神经网络中θ ( 1 ) \theta^{(1)} θ(1) 的尺寸为 3*4。
对于上图所示的模型,激活单元和输出分别表达为:
a 1 ( 2 ) = g ( θ 10 ( 1 ) x 0 + θ 11 ( 1 ) x 1 + θ 12 ( 1 ) x 2 + θ 13 ( 1 ) x 3 ) a_1^{(2)} = g(\theta_{10}^{(1)}x_0 + \theta_{11}^{(1)}x_1 + \theta_{12}^{(1)}x_2 + \theta_{13}^{(1)}x_3) a1(2)?=g(θ10(1)?x0?+θ11(1)?x1?+θ12(1)?x2?+θ13(1)?x3?)
a 2 ( 2 ) = g ( θ 20 ( 1 ) x 0 + θ 21 ( 1 ) x 1 + θ 22 ( 1 ) x 2 + θ 23 ( 1 ) x 3 ) a_2^{(2)} = g(\theta_{20}^{(1)}x_0 + \theta_{21}^{(1)}x_1 + \theta_{22}^{(1)}x_2 + \theta_{23}^{(1)}x_3) a2(2)?=g(θ20(1)?x0?+θ21(1)?x1?+θ22(1)?x2?+θ23(1)?x3?)
a 3 ( 2 ) = g ( θ 30 ( 1 ) x 0 + θ 31 ( 1 ) x 1 + θ 32 ( 1 ) x 2 + θ 33 ( 1 ) x 3 ) a_3^{(2)} = g(\theta_{30}^{(1)}x_0 + \theta_{31}^{(1)}x_1 + \theta_{32}^{(1)}x_2 + \theta_{33}^{(1)}x_3) a3(2)?=g(θ30(1)?x0?+θ31(1)?x1?+θ32(1)?x2?+θ33(1)?x3?)
h θ ( x ) = g ( θ 10 ( 2 ) a 0 ( 2 ) + θ 11 ( 2 ) a 1 ( 2 ) + θ 12 ( 2 ) a 2 ( 2 ) + θ 13 ( 2 ) a 3 ( 2 ) ) h_\theta(x) =g(\theta_{10}^{(2)}a_0^{(2)} + \theta_{11}^{(2)}a_1^{(2)} + \theta_{12}^{(2)}a_2^{(2)} + \theta_{13}^{(2)}a_3^{(2)}) hθ?(x)=g(θ10(2)?a0(2)?+θ11(2)?a1(2)?+θ12(2)?a2(2)?+θ13(2)?a3(2)?)
机器学习05-神经网络学习
文章图片

反向传播算法 机器学习05-神经网络学习
文章图片

我们以下图这个神经网络为例:
机器学习05-神经网络学习
文章图片

把任意神经元上的误差定义为δ j ( l ) = ? J ( θ ) ? z ( l ) \delta_j^{(l)} = \frac{\partial J(\theta)}{\partial z^{(l)}} δj(l)?=?z(l)?J(θ)?
则δ j ( 4 ) = a j ( 4 ) ? y j = ( h θ ( x ) ) j ? y j \delta ^{(4)}_j = a_j^{(4)} - y_j = (h_\theta(x))_j - y_j δj(4)?=aj(4)??yj?=(hθ?(x))j??yj?
手打公式太麻烦,直接上图

机器学习05-神经网络学习
文章图片

反向传播算法流程:
  • 对于训练集{ ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) , . . . , ( x ( m ) , y ( m ) ) } \{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})\} {(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))}
  • 对所有 l, i, j,初始化Δ i j ( l ) = 0 \Delta_{ij}^{(l)} = 0 Δij(l)?=0
  • for i = 1 to m :(即遍历训练集)
    • 令a ( 1 ) = x ( i ) a^{(1)} = x^{(i)} a(1)=x(i)
    • 利用前向传播算法计算a ( l ) a^{(l)} a(l),for l = 2 to L
    • 利用y ( i ) y^{(i)} y(i),计算输出层误差δ ( L ) = a ( L ) ? y ( i ) \delta^{(L)} = a^{(L)} - y^{(i)} δ(L)=a(L)?y(i)
    • 计算δ ( L ? 1 ) , δ ( L ? 2 ) , . . . , δ ( 2 ) \delta^{(L-1)},\delta^{(L-2)},...,\delta^{(2)} δ(L?1),δ(L?2),...,δ(2)
    • 累加Δ i j ( l ) , Δ i j ( l ) : = Δ i j ( l ) + a j ( l ) δ i ( l + 1 ) \Delta_{ij}^{(l)},\Delta_{ij}^{(l)}:= \Delta_{ij}^{(l)} + a_j^{(l)}\delta_i^{(l+1)} Δij(l)?,Δij(l)?:=Δij(l)?+aj(l)?δi(l+1)?
  • 计算梯度矩阵: D i j ( l ) = { 1 m Δ i j ( l ) + λ m θ i j ( l )i fj ≠ 0 1 m Δ i j ( l )i fj = 0 D_{ij}^{(l)} = \begin{cases}\frac{1}{m}\Delta_{ij}^{(l)} + \frac{\lambda}{m}\theta_{ij}^{(l)}~~~~~~if ~j \neq 0\\ \frac{1}{m}\Delta_{ij}^{(l)}~~~~~~~~~~~~~~~~~~~~~if~j = 0\end{cases} Dij(l)?={m1?Δij(l)?+mλ?θij(l)?if j?=0m1?Δij(l)?if j=0?
  • 更新权值θ ( l ) : = θ ( l ) + α D ( l ) \theta^{(l)} := \theta^{(l)} + \alpha D^{(l)} θ(l):=θ(l)+αD(l)
参考:
https://blog.csdn.net/xuan_liu123/article/details/83660316
理解反向传播算法 对于输出层,假设代价误差δ 1 ( 4 ) = y ( i ) ? a 1 ( 4 ) \delta_1^{(4)} = y^{(i)} - a_1^{(4)} δ1(4)?=y(i)?a1(4)?
接下来便可根据δ 1 ( 4 ) \delta_1^{(4)} δ1(4)? 利用方向传播算法计算出其他代价误差值,例如:
δ 2 ( 2 ) = Θ 12 ( 2 ) δ 1 ( 3 ) + Θ 22 ( 2 ) δ 2 ( 3 ) \delta_2^{(2)} = \Theta_{12}^{(2)}\delta_1^{(3)} + \Theta_{22}^{(2)}\delta_2^{(3)} δ2(2)?=Θ12(2)?δ1(3)?+Θ22(2)?δ2(3)?
δ 2 ( 3 ) = Θ 12 ( 3 ) δ 1 ( 4 ) \delta_2^{(3)} = \Theta_{12}^{(3)}\delta_1^{(4)} δ2(3)?=Θ12(3)?δ1(4)?
【机器学习05-神经网络学习】机器学习05-神经网络学习
文章图片

注:这些δ \delta δ 只包含隐藏单元,不包括偏置项,这取决于对反向传播的定义及实现算法的方式,也可以用其他方式来计算包含偏置项的δ \delta δ 值
梯度检测 由于反向传播算法有很多细节,实现起来比较困难,并且很容易产生一些 bug,当它与梯度下降算法或是其他一些算法一起工作时,看起来能够正常工作且代价函数J ( θ ) J(\theta) J(θ) 在每次迭代后都下降,但得到的神经网络其误差可能比没有 bug 时高了一个数量级。为了解决这个问题,采用了梯度检验。梯度检验能保证前向传播和反向传播是百分百正确的。
举个关于梯度检验的例子:
假设有一个代价函数J ( θ ) J(\theta) J(θ),某一点θ ∈ R \theta \in R θ∈R 在J ( θ ) J(\theta) J(θ) 的导数为J ( θ ) J(\theta) J(θ) 在该点的斜率,也可以通过极限逼近法来求:
d J ( θ ) d θ = J ( θ + ε ) ? J ( θ ? ε ) 2 ε \frac{dJ(\theta)}{d\theta} = \frac{J(\theta + \varepsilon) - J(\theta - \varepsilon)}{2\varepsilon} dθdJ(θ)?=2εJ(θ+ε)?J(θ?ε)?
理论上,当ε \varepsilon ε 足够小时,上式可以代表该点的导数,但若ε \varepsilon ε 太小,会引起很多数值上的问题,一般取ε = 1 0 ? 4 \varepsilon = 10^{-4} ε=10?4。
机器学习05-神经网络学习
文章图片

对于任何参数θ = θ 1 , θ 2 , . . . , θ n \theta = \theta_1,\theta_2, ..., \theta_n θ=θ1?,θ2?,...,θn?,其代价函数的所有偏导数项可以表示为:
? J ( θ ) ? θ 1 = J ( θ 1 + ε , θ 2 , . . . , θ n ) ? J ( θ 1 ? ε , θ 2 , . . . , θ n ) 2 ε \frac{\partial J(\theta)}{\partial\theta_1} = \frac{J(\theta_1+\varepsilon,\theta_2,...,\theta_n) - J(\theta_1-\varepsilon,\theta_2,...,\theta_n)}{2\varepsilon} ?θ1??J(θ)?=2εJ(θ1?+ε,θ2?,...,θn?)?J(θ1??ε,θ2?,...,θn?)?
? J ( θ ) ? θ 2 = J ( θ 1 , θ 2 + ε , . . . , θ n ) ? J ( θ 1 , θ 2 ? ε , . . . , θ n ) 2 ε \frac{\partial J(\theta)}{\partial\theta_2} = \frac{J(\theta_1,\theta_2+\varepsilon,...,\theta_n) - J(\theta_1,\theta_2-\varepsilon,...,\theta_n)}{2\varepsilon} ?θ2??J(θ)?=2εJ(θ1?,θ2?+ε,...,θn?)?J(θ1?,θ2??ε,...,θn?)?
? \vdots ?
? J ( θ ) ? θ n = J ( θ 1 , θ 2 , . . . , θ n + ε ) ? J ( θ 1 , θ 2 , . . . , θ n ? ε ) 2 ε \frac{\partial J(\theta)}{\partial\theta_n} = \frac{J(\theta_1,\theta_2,...,\theta_n+\varepsilon) - J(\theta_1,\theta_2,...,\theta_n-\varepsilon)}{2\varepsilon} ?θn??J(θ)?=2εJ(θ1?,θ2?,...,θn?+ε)?J(θ1?,θ2?,...,θn??ε)?
将计算出的导数或偏导数与反向传播中得到的梯度进行比较,如果结果非常相近的话(差几个小数点),则说明反向传播的实现是正确的。
如何实现数值上的梯度检验:
  • 通过反向传播计算梯度矩阵D ( 1 ) , D ( 2 ) , D ( 3 ) D^{(1)},D^{(2)},D^{(3)} D(1),D(2),D(3);
  • 使用梯度检验法计算梯度;
  • 比较两者的结果是否相近;
  • 在网络学习中使用反向传播算法,关闭梯度检验,因为梯度检验非常的耗时,相比之下,反向传播要快很多。
随机初始化 对于梯度下降算法或者其他更高级的算法,需要为变量θ \theta θ 设置一个初始值,这个初始值应该如何设置,能够将θ \theta θ 全都初始化为0?
以下图的神经网络为例,假设将所有的权重都初始化为 0,则有a 1 ( 2 ) = a 2 ( 2 ) , δ 1 ( 2 ) = δ 2 ( 2 ) a_1^{(2)} = a_2^{(2)},\delta_1^{(2)} = \delta_2^{(2)} a1(2)?=a2(2)?,δ1(2)?=δ2(2)?
对于偏导数,有? J ( θ ) ? θ 10 ( 1 ) = ? J ( θ ) ? θ 20 ( 1 ) \frac{\partial J(\theta)}{\partial \theta_{10}^{(1)}} = \frac{\partial J(\theta)}{\partial \theta_{20}^{(1)}} ?θ10(1)??J(θ)?=?θ20(1)??J(θ)?,更新权重之后,仍有θ 10 ( 1 ) = θ 20 ( 1 ) \theta_{10}^{(1)} = \theta_{20}^{(1)} θ10(1)?=θ20(1)?,这意味着在进行梯度迭代之后,仍有 $ a_1^{(2)} = a_2^{(2)}$。
假设我们不止有两个隐藏神经元,而是有很多,也就是说很多的神经元都在计算相同的特征,很多的神经元都以相同的函数作为输入,这是一种高度冗余的方法,意味着最后的逻辑回归单元只能得到一个特征。
因此,在进行初始化,采用随机初始化的方法,将权重随机初始化为接近 0,范围在( ? ε , ε ) (-\varepsilon,\varepsilon) (?ε,ε) 的数。
机器学习05-神经网络学习
文章图片

组和到一起 在进行神经网络训练时,要先选择一个网络架构,即有多少个输入,多少个输出,确定隐藏层数量和隐藏层单元数数量。
机器学习05-神经网络学习
文章图片

  • 输入单元数量:输入特征x ( i ) x^{(i)} x(i) 的维度
  • 输出单元数量:类别的数量,如判定是行人、摩托还是汽车,则输出单元数量为3(独热编码)
  • 隐藏层:默认只有一个隐藏层,若不止一个隐藏层,默认每个隐藏层的隐藏单元数量相同。隐藏层数量和隐藏层单元数太多会使训练变慢,但总的来说还是越多越好。
训练神经网络步骤:
  • 构建网络架构,随机初始化权重,一般初始化为接近 0 的数;
  • 实施前向传播为每个输入x ( i ) x^{(i)} x(i) 计算h θ ( x ( i ) ) h_\theta(x^{(i)}) hθ?(x(i));
  • 计算代价函数J ( θ ) J(\theta) J(θ);
  • 利用反向传播计算偏导数? J ( θ ) ? θ j k ( l ) \frac{\partial J(\theta)}{\partial \theta_{jk}^{(l)}} ?θjk(l)??J(θ)?,至此我们就可以得到每一层的激励a ( l ) a^{(l)} a(l) 和 delta值δ ( l ) \delta^{(l)} δ(l);
  • 使用梯度检验计算出偏导数,并与通过反向传播计算出的值进行比较,比较完后,关闭梯度检验;
  • 使用梯度下降算法或其他高级算法求出使得J ( θ ) J(\theta) J(θ) 最小的θ \theta θ 的值。
神经网络中的梯度下降算法 原理:从某个随机初始点开始不停的往下降,反向传播算法的目的是算出梯度下降的方向,而梯度下降算法的作用是沿着这个方向一点点往下降,直到我们希望得到的点。机器学习05-神经网络学习
文章图片

    推荐阅读