飞道的博客

深度学习入门~神经网络的梯度下降④

273人阅读  评论(0)

神经网络的梯度下降

  • 浅层神经网络的参数:
    W【1】,b【1】,W【2】,b【2】,它们的维度分别是(n【1】,n【0】),(n【1】,1),(n【2】,n【1】),(n【2】,1)。
  • 暂定我们要实现的浅层神经网络做的是二元分类操作,那么我们的代价函数就和Logistic回归的代价函数相同。即:J = 1/m×∑ni=1L(y_hat,y)。
  • 在训练神经网络时,将参数随机初始化是很重要的一步操作,而不是将他们全部初始化为0。
  • 因此,总结一下,以下是神经网络二元分类问题中,正向传播的过程:
    Forward propagation:
    Z【1】 = W【1】X + b【1】
    A【1】 = g【1】(Z【1】)
    Z【2】 = W【2】A【1】 + b【2】
    A【2】 = g【2】(Z【2】) = σ(Z【2】)
    以下是反向传播的过程,即计算导数:
    Back propagation:
    dZ【2】 = A【2】 - Y(Y为基本真值,是1×m个样本横向堆叠起来的)
    dW【2】 = 1/m×dZ【2】A【1】T
    db【2】 = 1/m×np.sum(dZ【2】,axis = 1,keepdim = True)(np.sum()是numpy的一条指令,它可以计算矩阵某一行或一列的和)
    dZ【1】 = W【2】TdZ【2】*g【1】’(Z【1】)(注:1)*为矩阵按位置相乘,这需要两个矩阵的行列数相同。2)g【1】’(Z【1】有一撇,代表它是g的导数。)
    dW【1】 = 1/m×dZ【1】XT
    db【1】 = 1/m×np.sum(dZ【1】,axis = 1,keepdims = True)(numpy的np.sum()中的参数keepdims是为了放置运算的结果成为秩为1的矩阵)<如果如储层只有一个神经元,那么对于db【2】的输出是一个1×1的矩阵,即一个实数,而对于db【1】,它一定是一份n【1】×1的矩阵,如果想用numpy生成这个多维向量,而不是形式奇怪的一维数组,则需要使用keepdims参数,或使用reshape重塑np.sum得到矩阵的形状>

直观理解反向传播

  • 如何计算Logistic回归的梯度?

    显然,从正向传播,我们会得到损失函数L(a,y),而通过反向传播,我们会得到导数项dW,db并以它们来改变参数W和b以更好地拟合二元分类问题样本。
  • 从L开始进行反向传播:
    L(a,y) = -yloga - (1-y)log(1-a)
    da = dL(a,y)/da = -y/a + (1-y)/(1-a)
    dz = dL(a,y)/dz =dL/dada/dz = a-y
    dW = dZ
    x
    db = dZ
  • 将反向传播用于神经网络中:

    很明显,在从输出层到第一层的反向传播导数计算,和Logistic回归的反向传播类似,而从第一层到输入层的反向传播,则更为复杂,要考虑维度是否相等的问题,具体的导数表达式如下👇。

    👇右侧为神经网络反向传播的向量化版本:

    所谓向量化是指输入不再是单一的输入向量,而是由多个样本按列展开堆叠而形成的输入矩阵。因此,使用大写字母更新导数项的表示,它们都是矩阵,列数由1扩展为m,因为由m个训练样本,而×1/m是因为这是对m个样本求的平均值。

转载:https://blog.csdn.net/fatfairyyy/article/details/115803380
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场