机器学习,神经网络算法笔记(草履虫都能看懂),简单的一批

机器学习笔记系列

可以从上至下按顺序看喔

有监督学习

含义

  • 给算法一个数据集,其中包含了正确的答案,告诉算法啥是对的啥是错的

  • 我们想要在监督学习中,对于数据集中的每个样本,我们想要算法预测,并得出正确答案

神经网络

人工神经元

  • image-20211031153723700
  • 上图中的x0是“偏置单元”, 上图名称为“带有sigmoid激活函数的人工神经元”,且为单个神经元
  • 激活函数:像sigmoid函数等一些非线性函数的别称
  • x为我们的输入单元,theta为我们的参数(权重)

神经网络

  • 神经网络是由多个神经元所构成的,如下图所示

  • image-20211031154859443
  • 其中的层一为输入层,层二为隐藏层,层三为输出层

  • 为什么叫隐藏层?

    • 因为该层的值在训练集里是看不到,所以叫隐藏层
    • 一个神经网络可拥有多个隐藏层,实际上除了输入层与输出层以外的都叫隐藏层
  • 既然隐藏层的值在训练集看不到,可以通过以下计算出隐藏层的值

    • 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 ) = a 1 ( 3 ) = g ( Θ 10 ( 2 ) a 0 ( 2 ) + Θ 11 ( 2 ) a 1 ( 2 ) + Θ 12 ( 2 ) a 2 ( 2 ) + Θ 13 ( 2 ) a 3 ( 2 ) ) h_\Theta(x)=a_1^{(3)}=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)=a1(3)=g(Θ10(2)a0(2)+Θ11(2)a1(2)+Θ12(2)a2(2)+Θ13(2)a3(2))
    • 可以看出以上计算可以统一归一到一个矩阵的计算,我们可以将其向量化一下
      • Θ ( 1 ) = [ Θ 10 ( 1 ) Θ 11 ( 1 ) Θ 12 ( 1 ) Θ 13 ( 1 ) Θ 20 ( 1 ) Θ 21 ( 1 ) Θ 22 ( 1 ) Θ 23 ( 1 ) Θ 30 ( 1 ) Θ 31 ( 1 ) Θ 32 ( 1 ) Θ 33 ( 1 ) ] ,   X = [ x 0 x 1 x 2 x 3 ] ,   Z ( 2 ) = [ z 1 ( 2 ) z 2 ( 2 ) z 3 ( 2 ) ] ,   A ( 2 ) = [ a 0 ( 2 ) a 1 ( 2 ) a 2 ( 2 ) a 3 ( 2 ) ] \Theta^{(1)}=\begin{bmatrix}\Theta_{10}^{(1)}&\Theta_{11}^{(1)}&\Theta_{12}^{(1)}&\Theta_{13}^{(1)}\\\Theta_{20}^{(1)}&\Theta_{21}^{(1)}&\Theta_{22}^{(1)}&\Theta_{23}^{(1)}\\\Theta_{30}^{(1)}&\Theta_{31}^{(1)}&\Theta_{32}^{(1)}&\Theta_{33}^{(1)}\end{bmatrix},\ X=\begin{bmatrix}x_0\\x_1\\x_2\\x_3\end{bmatrix},\ Z^{(2)}=\begin{bmatrix}z_1^{(2)}\\z_2^{(2)}\\z_3^{(2)}\end{bmatrix},\ A^{(2)}=\begin{bmatrix}a_0^{(2)}\\a_1^{(2)}\\a_2^{(2)}\\a_3^{(2)}\end{bmatrix} Θ(1)= Θ10(1)Θ20(1)Θ30(1)Θ11(1)Θ21(1)Θ31(1)Θ12(1)Θ22(1)Θ32(1)Θ13(1)Θ23(1)Θ33(1) , X= x0x1x2x3 , Z(2)= z1(2)z2(2)z3(2) , A(2)= a0(2)a1(2)a2(2)a3(2)
      • Z ( 2 ) = Θ ( 1 ) X Z^{(2)}=\Theta^{(1)}X Z(2)=Θ(1)X
      • A ( 2 ) = g ( Z ( 2 ) )    ( 添加 a 0 ( 2 ) ) A^{(2)}=g(Z^{(2)})\ \ (添加a_0^{(2)}) A(2)=g(Z(2))  (添加a0(2))
      • Z ( 3 ) = Θ ( 2 ) A ( 2 ) Z^{(3)}=\Theta^{(2)}A^{(2)} Z(3)=Θ(2)A(2)
      • h Θ ( x ) = A ( 3 ) = g ( Z ( 3 ) )    ( 添加 a 0 ( 3 ) ) h_\Theta(x)=A^{(3)}=g(Z^{(3)})\ \ (添加a_0^{(3)}) hΘ(x)=A(3)=g(Z(3))  (添加a0(3))
  • 如果只有一层的神经网络,就有点类似于分类任务里的逻辑回归,如图所示

  • image-20211031220247647
  • 因为输入值就是我们的a1 - a3,没有隐藏层,所以也就只有一个计算层,也就是最后的输出h(x)

  • image-20211031221026901
  • 而超过了两层的神经网络则就和逻辑回归不太一样了,因为他有了两个计算层,也就是上图的层2和层3

  • 我们最终输出的层3是由隐藏层2计算得来的,而隐藏层又是由输入层1计算而来的

  • 也就是说,逻辑回归的特征值是从训练集中直接获得的,而这里的神经网络,则是先从训练集中获取特征值,然后再对原始特征值进行学习,从而得到一个更好的特征值,再用该特征值当参数来进行预测

前向传播(正向传播)

  • 向前传播其实就是上述表示的综合说法,就拿上图的神经网络来说,我们预先是不知道第二层和第三层的值的
  • 第二层的值需要通过第一层,也就是输入层的加权参数得来后才能计算得来,而我们第三层的值又需要第二层的加权参数传递后才能算出来
  • 这么一个过程,叫做前向传播

如何用神经网络进行多元分类?

  • 当我们想利用神经网络进行分类多个数据的时候,我们需要给神经网络增加多个输出口
  • 比如我们需要检测四个类型的对象,哪些是行人,汽车,摩托车,卡车,也就是多分类的问题,我们需要的神经网络如下图所示
  • image-20211101162311466
  • 我们可以看到,在最后的输出层现在有了四个输出单元,也就是说,我们的输出层现在是一个四维向量
  • 我们用第一个单元判断是否是行人,是的话为1不是为0,第二个单元判断是否是汽车,等等
  • 例如当检测到了是行人,则输出单元会变成这样 h Θ ( x ) = [ 1 0 0 0 ] h_\Theta(x)=\begin{bmatrix}1\\0\\0\\0\end{bmatrix} hΘ(x)= 1000
  • 当检测成汽车,则输出单元是 h Θ ( x ) = [ 0 1 0 0 ] h_\Theta(x)=\begin{bmatrix}0\\1\\0\\0\end{bmatrix} hΘ(x)= 0100 ,等等
  • 这其实就是逻辑回归里的一对多分类,只不过现在变成了四个逻辑回归分类器来对可能检测到的类别进行分类
  • 在逻辑回归里,我们在训练集里输入的y值等于1、2、3等等值,而如果要用神经网络进行多元分类的话
  • 则训练集的y值则就应该是一个向量了,例如 y ( i ) = [ 1 0 0 0 ] ( 行人 ) , [ 0 1 0 0 ] ( 汽车 ) , [ 0 0 1 0 ] ( 摩托车 ) , [ 0 0 0 1 ] ( 卡车 ) y^{(i)}=\begin{bmatrix}1\\0\\0\\0\end{bmatrix}(行人),\begin{bmatrix}0\\1\\0\\0\end{bmatrix}(汽车),\begin{bmatrix}0\\0\\1\\0\end{bmatrix}(摩托车),\begin{bmatrix}0\\0\\0\\1\end{bmatrix}(卡车) y(i)= 1000 (行人), 0100 (汽车), 0010 (摩托车), 0001 (卡车)
  • 而与之对应对x则应该是相符合的y的图像,训练集就应该是这样的
  • ( 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))

代价函数

  • 通过上诉表达,我们知道了神经网络的假设函数是怎么来的了,那么接下来,我们需要最小化代价函数从而得到最优化的假设函数的参数值,或者也叫权重值。
  • 我们先来看一下逻辑回归的代价函数: 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\limits_{i=1}^my^{(i)}log(h_\theta(x^{(i)}))+(1-y^{(i)})log(1-h_\theta(x^{(i)}))]+\frac{\lambda}{2m}\sum\limits_{j=1}^n\theta_j^2 J(Θ)=m1[i=1my(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))]+2mλj=1nθj2
  • 我们知道,逻辑回归中的分类问题都只是分出一个类就行了,所以y的值只是一个实数,而在神经网络中,我们可能需要分出好几类
  • 比如上面那个例子,我们需要同时分出哪个是车,哪个是行人,等等,所以这里的y的值,就需要用一个向量来完成对分类结果的存储,所以我们的代价函数就需要对y向量中的每一个分量再做一次累加
  • 同时在逻辑回归中,我们的假设函数也是只预测一个值,而在这里我们的假设函数预测的也是一个向量了,所以也需要对假设函数所预测的向量内的每一个分量进行一次累加,于是代价函数如下所示
  • 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\limits_{i=1}^m\sum\limits_{k=1}^Ky_k^{(i)}log(h_\theta(x^{(i)}))_k+(1-y_k^{(i)})log(1-h_\theta(x^{(i)})_k)]+\frac{\lambda}{2m}\sum\limits_{l=1}^{L-1}\sum\limits_{i=1}^{s_l}\sum\limits_{j=1}^{s_{l+1}}(\theta_{ji}^{(i)})^2 J(Θ)=m1[i=1mk=1Kyk(i)log(hθ(x(i)))k+(1yk(i))log(1hθ(x(i))k)]+2mλl=1L1i=1slj=1sl+1(θji(i))2
  • 我们来解释一下上式代价值项
    • 在线性回归及逻辑回归中我们知道,代价函数中的代价值就是算你的预测值与在训练集中的实际值的误差,而代价函数就是将所有样本的误差累加起来求平均得到一个平均误差,在神经网络这里,我们的实际值y是一个向量,而我们的预测值h(x)也是一个向量,我们如何对这两个向量之间求误差呢?就是同时将其向量内的每个值取出来求误差即可,这也就是上式中多加一个求和符号K的原因
  • 我们再来解释一下上式正则项
    • 在逻辑回归中我们知道,对于所有的参数theta,我们都可以用一个向量来表示它,所以我们只需要对这个向量内的所有参数进行惩罚就行了(除了偏置项),用一个j就可以遍历整个向量了,而在神经网络中,我们的参数theta是一个矩阵形式存在的,i代表第几行,j代表第几列,所以我们需要用i,j两个值来累加这个矩阵中的所有theta参数,而l则是表示该参数是在第几层的权重矩阵中,因为在神经网络中,层数不只是一层,可能有多层,所以我们需要对每一层的权重矩阵都进行一个惩罚,而我们知道,在神经网络的第一层,也就是输入层,是没有权重矩阵的,因为输入层是直接将训练集的值输入进来,是一个确切的值,所以正则项最外层的累加是到L-1的

反向传播

介绍
  • 反向传播的目的很简单,就是用来求出每个神经元的误差,使得神经网络可以使用梯度下降法来最小化代价函数,从而找到最优的权重矩阵,能够使得假设函数可以最大程度拟合数据集
为什么需要反向传播?
  • 我们来回忆一下,我们在逻辑回归中是如何最小化代价函数的,没错,是用梯度下降法
  • 而用梯度下降法我们需要知道两个东西的值: J ( Θ ) ,    ∂ ∂ θ j J ( Θ ) J(\Theta),\ \ \frac{\partial}{\partial\theta_j}J(\Theta) J(Θ),  θjJ(Θ)
  • 这时我们思考一下,可否在神经网络中直接使用梯度下降法来最小化我们的代价函数呢?
  • 显然是很难的,因为在逻辑回归中我们可以看到,我们对于代价函数其中的每个参数求导都是可以直接得到的
  • 因为逻辑回归代价函数中的特征值x和所对应的y值都是通过训练集直接传递的
  • 而神经网络这里,在输入层与输出层之间可能存在多个隐藏层,每个隐藏层的值都是由上一层加权和之后代入激励函数中得到的,假设我们最后的输出层为L,则它需要L-1层所有单元的加权和且代入激励函数中得出
  • 若神经网络层数大于等于3层时,这时的L-1层的所有单元值,就已经不是我们从训练集获得的特征值了
  • 所以我们需要反向传播算法来快速获得代价函数对每个theta值的偏导数来为后续的梯度下降做准备
运用
  • 也就是我们需要知道 J ( Θ ) ,    ∂ ∂ Θ i j ( l ) J ( Θ ) J(\Theta),\ \ \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta) J(Θ),  Θij(l)J(Θ) 俩的值
  • 代价函数公式: 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\limits_{i=1}^m\sum\limits_{k=1}^Ky_k^{(i)}log(h_\theta(x^{(i)}))_k+(1-y_k^{(i)})log(1-h_\theta(x^{(i)})_k)]+\frac{\lambda}{2m}\sum\limits_{l=1}^{L-1}\sum\limits_{i=1}^{s_l}\sum\limits_{j=1}^{s_{l+1}}(\theta_{ji}^{(i)})^2 J(Θ)=m1[i=1mk=1Kyk(i)log(hθ(x(i)))k+(1yk(i))log(1hθ(x(i))k)]+2mλl=1L1i=1slj=1sl+1(θji(i))2
  • 假设我们要用反向传播在下图神经网络中
  • image-20211103153643273
  • 我们在这里定义 δ j ( l ) \delta_j^{(l)} δj(l) 为第l层的第j个单元激活值的误差
  • 那么我们可以知道,最后输出层的误差为: δ ( 4 ) = a ( 4 ) − y \delta^{(4)}=a^{(4)}-y δ(4)=a(4)y
  • 也就是我们的预测值减去训练样本的实际值,上面用的是向量的形式写的
  • 而第三层的误差为: δ ( 3 ) = ( Θ ( 3 ) ) T δ ( 4 ) . ∗ g ′ ( z ( 3 ) ) \delta^{(3)}=(\Theta^{(3)})^T\delta^{(4)}.*g'(z^{(3)}) δ(3)=(Θ(3))Tδ(4).g(z(3))
  • 第二层的误差为: δ ( 2 ) = ( Θ ( 2 ) ) T δ ( 3 ) . ∗ g ′ ( z ( 2 ) ) \delta^{(2)}=(\Theta^{(2)})^T\delta^{(3)}.*g'(z^{(2)}) δ(2)=(Θ(2))Tδ(3).g(z(2))
  • 第一层没有误差,因为第一层是直接从训练集取出的数据
  • 所以我们可以得到一个求误差delta的通用公式: δ ( l ) = { 0  if  l = 0 ( Θ ( l ) ) T δ ( l + 1 ) . ∗ g ′ ( z ( l ) )  if  1 ≤ l ≤ L − 1 y − a ( l )  if  l = L \delta^{(l)}=\begin{cases} 0& \text{ if } l=0 \\ (\Theta^{(l)})^T\delta^{(l+1)}.*g'(z^{(l)})& \text{ if } 1\le l\le L-1 \\ y-a^{(l)}& \text{ if } l=L \end{cases} δ(l)= 0(Θ(l))Tδ(l+1).g(z(l))ya(l) if l=0 if 1lL1 if l=L
  • 而我们对每一层参数theta的偏导数为: ∂ ∂ Θ ( l ) J ( Θ ) = δ ( l + 1 ) ( a ( l ) ) T \frac{\partial}{\partial\Theta^{(l)}}J(\Theta)=\delta^{(l+1)}(a^{(l)})^T Θ(l)J(Θ)=δ(l+1)(a(l))T
  • 由此可以看到,反向传播就是先通过直接算出最后一层的误差,然后往前推,比如我们要计算第三层的误差,我们就可以用第四层的误差来进行计算,而我们要求出第二层的误差,那么就需要用到第三层的误差,这样从后往前推,这就是反向传播
  • 用一句话来概述就是,我们先随机放入一组参数值,然后正向传播进行预测,到了最后的输出层的时候,我们判断我们输出的结果和真实结果是否有误差,如果有误差我们进行反向传播,逐层将每层的误差算出来然后根据我们的误差来更新我们的参数值,然后用新的参数值再进行正向传播,算出新的误差,再反向传播更新参数值,以此来不停的缩小我们的误差值,从而进行参数的训练
步骤
  1. 首先我们得有m个训练集
  2. 将累计偏导数 Δ i j ( l ) \Delta_{ij}^{(l)} Δij(l)给初始化为0
  3. 进行每个样本的迭代:For i in range(m)
    1. a ( 1 ) = x ( i ) a^{(1)}=x^{(i)} a(1)=x(i),将第i个样本赋值给输入层的激活函数
    2. 进行正向传播,计算每一层的 a ( l ) , l = 2 , 3 , . . . , L a^{(l)},l=2,3,...,L a(l),l=2,3,...,L
    3. 通过训练集中每个 x ( i ) x^{(i)} x(i)对应的 y ( i ) y^{(i)} y(i),我们计算出最后输出层所对应的误差项 δ ( L ) = a ( L ) − y ( i ) \delta^{(L)}=a^{(L)}-y^{(i)} δ(L)=a(L)y(i)
    4. 进行反向传播,计算每一层的误差 δ ( L − 1 ) , δ ( L − 2 ) , . . . , δ ( 2 ) \delta^{(L-1)},\delta^{(L-2)},...,\delta^{(2)} δ(L1),δ(L2),...,δ(2)
    5. 通过得来的误差,计算出偏导数值,再将所有的偏导数值累加起来 Δ i j ( l ) : = Δ i j ( l ) + a j ( l ) δ i ( l + 1 ) \Delta_{ij}^{(l)}:=\Delta_{ij}^{(l)}+a_j^{(l)}\delta_i^{(l+1)} Δij(l):=Δij(l)+aj(l)δi(l+1)
  4. D i j ( l ) : = 1 m Δ i j ( l ) + λ Θ i j ( l ) D_{ij}^{(l)}:=\frac{1}{m}\Delta_{ij}^{(l)}+\lambda\Theta_{ij}^{(l)} Dij(l):=m1Δij(l)+λΘij(l),当j不等于0时,计算出偏导数项的平均值并且对其正则化
  5. D i j ( l ) : = 1 m Δ i j ( l ) D_{ij}^{(l)}:=\frac{1}{m}\Delta_{ij}^{(l)} Dij(l):=m1Δij(l),当j=0时,代表该项为偏置项,所以不需要对其进行正则化
  6. ∂ ∂ Θ i j ( l ) J ( Θ ) = D i j ( l ) \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta)=D_{ij}^{(l)} Θij(l)J(Θ)=Dij(l),最后得出来的值就是参数theta的偏导数项

梯度检测

为啥要进行梯度检测?
  • 当我们进行反向传播时,可能会遇到一些bug或者因为我们的疏忽所导致的求偏导数的错误,但是我们又很难发现的了,因为他只是输出了错误的偏导数结果,程序可能不会崩溃,于是我们的程序就会用这个错误的结果来进行梯度下降或者是其他的高级算法来最小化代价函数,所以我们需要进行梯度检测以防止反向传播中可能出现的bug
原理
  • 举个例子,如下图所示,是一个非线性函数的图像
  • image-20211103202829055
  • 这条线是点theta在代价函数中的导数,我们通过什么办法可以找到一条线来相似于这个导数呢?
  • 众所周知,该点处导数的实际意义就是该点切线的斜率,我们可以这样做:
    • 我们给theta加上一个极小的值,和减去一个极小的值 ε \varepsilon ε
    • 然后再连接这俩点的函数值,也就是 J ( θ + ε ) ,    J ( θ − ε ) J(\theta+\varepsilon),\ \ J(\theta-\varepsilon) J(θ+ε),  J(θε)
    • 我们可以得到一个如下图所示的红色斜线,这条线的斜率从理论上来说,只要 ε \varepsilon ε足够小,那么该斜线的值将会无穷的相似于我们的导数值,甚至在计算机的有限精度下等于我们的导数值
    • 于是该斜线的公式就等于: g r a d A p p r o x = J ( θ + ε ) − J ( θ − ε ) 2 ε gradApprox=\frac{J(\theta+\varepsilon)-J(\theta-\varepsilon)}{2\varepsilon} gradApprox=2εJ(θ+ε)J(θε)
    • 该式会在某个精度值之内,无限等于我们的偏导数: ∂ ∂ θ J ( Θ ) = g r a d A p p r o x \frac{\partial}{\partial\theta}J(\Theta)=gradApprox θJ(Θ)=gradApprox
  • image-20211103203155758
  • 因为我们上面的例子只有一个参数,而在神经网络中,通常参数都是非常多的,由此,我们可以从低维推广到高维,通过分别对每个参数进行上述操作从而达到对每个参数的求偏导的近似值
    • ∂ ∂ θ 1 J ( Θ ) ≈ J ( θ 1 + ε , θ 2 , θ 3 , . . . , θ n ) − J ( θ 1 − ε , θ 2 , θ 3 , . . . , θ n ) 2 ε \frac{\partial}{\partial\theta_1}J(\Theta)\approx\frac{J(\theta_1+\varepsilon,\theta_2,\theta_3,...,\theta_n)-J(\theta_1-\varepsilon,\theta_2,\theta_3,...,\theta_n)}{2\varepsilon} θ1J(Θ)2εJ(θ1+ε,θ2,θ3,...,θn)J(θ1ε,θ2,θ3,...,θn)
    • ∂ ∂ θ 2 J ( Θ ) ≈ J ( θ 1 , θ 2 + ε , θ 3 , . . . , θ n ) − J ( θ 1 , θ 2 − ε , θ 3 , . . . , θ n ) 2 ε \frac{\partial}{\partial\theta_2}J(\Theta)\approx\frac{J(\theta_1,\theta_2+\varepsilon,\theta_3,...,\theta_n)-J(\theta_1,\theta_2-\varepsilon,\theta_3,...,\theta_n)}{2\varepsilon} θ2J(Θ)2εJ(θ1,θ2+ε,θ3,...,θn)J(θ1,θ2ε,θ3,...,θn)
    • ∂ ∂ θ 2 J ( Θ ) ≈ J ( θ 1 , θ 2 , θ 3 , . . . , θ n + ε ) − J ( θ 1 , θ 2 , θ 3 , . . . , θ n − ε ) 2 ε \frac{\partial}{\partial\theta_2}J(\Theta)\approx\frac{J(\theta_1,\theta_2,\theta_3,...,\theta_n+\varepsilon)-J(\theta_1,\theta_2,\theta_3,...,\theta_n-\varepsilon)}{2\varepsilon} θ2J(Θ)2εJ(θ1,θ2,θ3,...,θn+ε)J(θ1,θ2,θ3,...,θnε)
总结
  1. 我们先要通过反向传播计算出梯度值
  2. 使用梯度检测计算出梯度值
  3. 比较反向传播与梯度检测的值是否一致或者相差很小,若相差很大则需要检测自己的代码有没有写错
  4. 通过第3步确保梯度没错后,在将代码正式使用在测试集之前务必关闭梯度检测,因为梯度检测的时间复杂度非常高

参考链接

  • https://www.bilibili.com/video/BV1FT4y1E74V/?spm_id_from=333.337.search-card.all.click&vd_source=97163a4e6e2704667559fdbd58743862
  • 34
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值