> 文章列表 > 深度学习笔记之权重初始化方式——零初始化

深度学习笔记之权重初始化方式——零初始化

深度学习笔记之权重初始化方式——零初始化

深度学习笔记之权重初始化方式——零初始化

  • 引言
    • 回顾:逻辑回归
      • 场景构建
    • 逻辑回归是否可以使用零初始化权重???
    • 神经网络是否可以使用零初始化权重???

引言

我们在刷题系列——训练过程损失函数不下降问题中提到了初始化权重方式,本节将介绍零初始化权重参数。并介绍为什么神经网络不能使用零初始化权重参数的操作。

回顾:逻辑回归

逻辑回归是一个典型的概率判别模型。以二分类任务为例,关于后验概率P(y(i)=1∣x(i)),P(y(i)=0∣x(i))\\mathcal P(y^{(i)} = 1 \\mid x^{(i)}),\\mathcal P(y^{(i)} = 0 \\mid x^{(i)})P(y(i)=1x(i)),P(y(i)=0x(i))可直接使用Sigmoid\\text{Sigmoid}Sigmoid函数进行表示:
{p1=P(y(i)=1∣x(i))=11+exp⁡{−WTx(i)}p2=P(y(i)=0∣x(i))=exp⁡{−WTx(i)}1+exp⁡{−WTx(i)}\\begin{cases} p_1 = \\mathcal P(y^{(i)} = 1\\mid x^{(i)}) = \\begin{aligned} \\frac{1}{1 + \\exp\\{-\\mathcal W^Tx^{(i)}\\}} \\end{aligned} \\\\ p_2 = \\mathcal P(y^{(i)} = 0 \\mid x^{(i)}) = \\begin{aligned} \\frac{\\exp\\{-\\mathcal W^Tx^{(i)}\\}}{1 + \\exp \\{-\\mathcal W^Tx^{(i)}\\}} \\end{aligned} \\end{cases}p1=P(y(i)=1x(i))=1+exp{WTx(i)}1p2=P(y(i)=0x(i))=1+exp{WTx(i)}exp{WTx(i)}
并对后验结果直接进行比较,得到最终的预测结果:
p1=?p2p_1 \\overset{\\text{?}}{=} p_2p1=?p2

场景构建

数据集合D={(x(i),y(i))}i=1N\\mathcal D = \\{(x^{(i)},y^{(i)})\\}_{i=1}^ND={(x(i),y(i))}i=1N,并且每一个样本x(i)(i=1,2,⋯,N)x^{(i)}(i=1,2,\\cdots,N)x(i)(i=1,2,,N)仅包含222个随机变量;对应标签y(i)∈{0,1}y^{(i)} \\in \\{0,1\\}y(i){0,1}
x(i)=(x1(i),x2(i))2×1Tx^{(i)} = (x_1^{(i)},x_2^{(i)})_{2 \\times 1}^Tx(i)=(x1(i),x2(i))2×1T
对应的逻辑回归公式可表达如下形式:
偏置项bbb可看作一个常数输入的权重信息,将其合并至权重W\\mathcal WW中,省略。
ypred=Sigmoid(W1x1+W2x2)y_{pred} = \\text{Sigmoid}(\\mathcal W_1 x_1 + \\mathcal W_2 x_2)ypred=Sigmoid(W1x1+W2x2)
并使用交叉熵(CrossEntropy)(\\text{CrossEntropy})(CrossEntropy)作为损失函数。它的本质是极大似然估计(Maximum Likelihood Estimate,MLE)(\\text{Maximum Likelihood Estimate,MLE})(Maximum Likelihood Estimate,MLE)
{P(y(i)∣x(i))=p1y(i)⋅p2(1−y(i))P(Y∣X)=∏i=1NP(y(i)∣x(i))W^=arg⁡max⁡WP(Y∣X)\\begin{cases} \\begin{aligned} & \\mathcal P(y^{(i)} \\mid x^{(i)}) = p_1^{y^{(i)}} \\cdot p_2^{(1 - y^{(i)})} \\\\ & \\mathcal P(\\mathcal Y \\mid \\mathcal X) = \\prod_{i=1}^N \\mathcal P(y^{(i)} \\mid x^{(i)}) \\end{aligned} \\end{cases} \\\\ \\hat {\\mathcal W} = \\mathop{\\arg\\max}\\limits_{\\mathcal W} \\mathcal P(\\mathcal Y \\mid \\mathcal X) P(y(i)x(i))=p1y(i)p2(1y(i))P(YX)=i=1NP(y(i)x(i))W^=WargmaxP(YX)
加上log⁡\\loglog函数,并不影响最优参数W^\\hat{\\mathcal W}W^的取值:
W^=arg⁡max⁡W∑i=1Nlog⁡P(y(i)∣x(i))=arg⁡max⁡W∑i=1N[y(i)log⁡p1+(1−y(i))log⁡p2]=arg⁡min⁡W{−∑i=1N[y(i)log⁡p1+(1−y(i))log⁡p2]}\\begin{aligned} \\hat {\\mathcal W} & = \\mathop{\\arg\\max}\\limits_{\\mathcal W} \\sum_{i=1}^N \\log \\mathcal P(y^{(i)} \\mid x^{(i)}) \\\\ & = \\mathop{\\arg\\max}\\limits_{\\mathcal W} \\sum_{i=1}^N \\left[y^{(i)} \\log p_1 + (1 - y^{(i)}) \\log p_2 \\right] \\\\ & = \\mathop{\\arg\\min}\\limits_{\\mathcal W} \\left\\{ - \\sum_{i=1}^N \\left[y^{(i)} \\log p_1 + (1 - y^{(i)}) \\log p_2\\right]\\right\\} \\end{aligned}W^=Wargmaxi=1NlogP(y(i)x(i))=Wargmaxi=1N[y(i)logp1+(1y(i))logp2]=Wargmin{i=1N[y(i)logp1+(1y(i))logp2]}
至此,交叉熵损失函数可表示为:
{L(W)=−ylog⁡ypred−(1−y)log⁡(1−ypred)W^=arg⁡min⁡WL(W)\\begin{cases} \\mathcal L(\\mathcal W) = - y \\log y_{pred} - (1 - y) \\log (1 - y_{pred}) \\\\ \\hat {\\mathcal W} = \\mathop{\\arg\\min}\\limits_{\\mathcal W} \\mathcal L(\\mathcal W) \\end{cases}L(W)=ylogypred(1y)log(1ypred)W^=WargminL(W)
关于逻辑回归的计算结构表示如下:
需要注意的是,逻辑回归的模型结构并不是神经网络,它不包含隐藏层。实际上,它可看作是一个‘神经元’。
逻辑回归——模型结构

逻辑回归是否可以使用零初始化权重???

虽然逻辑回归可以使用极大似然估计求出它的解析解,但为了观察零初始化权重是否对它的计算过程产生影响,这里使用梯度下降法对权重进行迭代求解

  • 关于Sigmoid\\text{Sigmoid}Sigmoid函数的导数:f′(x)=f(x)[1−f(x)]f'(x) = f(x) [1 - f(x)]f(x)=f(x)[1f(x)]
  • 链式求导法则。
    {∂L(W)∂ypred=−yypred+1−y1−ypred∂L(W)∂w1=∂L(W)∂ypred⋅∂ypred∂w1=(−yypred+1−y1−ypred)⋅x1⋅ypred(1−ypred)=(ypred−y)⋅x1∂L(W)∂w2=∂L(W)∂ypred⋅∂ypred∂w2=(ypred−y)⋅x2\\begin{cases} \\begin{aligned} \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial y_{pred}} & = - \\frac{y}{y_{pred}} + \\frac{1 - y}{1 - y_{pred}} \\\\ \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial w_1} & = \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial y_{pred}} \\cdot \\frac{\\partial y_{pred}}{\\partial w_1} \\\\ & = \\left(- \\frac{y}{y_{pred}} + \\frac{1 - y}{1 - y_{pred}}\\right) \\cdot x_1 \\cdot y_{pred}(1 - y_{pred}) \\\\ & = (y_{pred} - y) \\cdot x_1 \\\\ \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial w_2} & = \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial y_{pred}} \\cdot \\frac{\\partial y_{pred}}{\\partial w_2} \\\\ & = (y_{pred} - y) \\cdot x_2 \\end{aligned} \\end{cases}ypredL(W)w1L(W)w2L(W)=ypredy+1ypred1y=ypredL(W)w1ypred=(ypredy+1ypred1y)x1ypred(1ypred)=(ypredy)x1=ypredL(W)w2ypred=(ypredy)x2

关于权重w1,w2w_1,w_2w1,w2迭代过程可表示为如下形式:
{w1⇐w1−η⋅∂L(W)∂w1w2⇐w2−η⋅∂L(W)∂w2\\begin{cases} \\begin{aligned} w_1 \\Leftarrow w_1 - \\eta \\cdot \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial w_1} \\\\ w_2 \\Leftarrow w_2 - \\eta \\cdot \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial w_2} \\end{aligned} \\end{cases}w1w1ηw1L(W)w2w2ηw2L(W)
这里观察其中一项η⋅∂L(W)∂w1=η⋅(ypred−y)⋅x1\\begin{aligned}\\eta \\cdot\\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial w_1} = \\eta \\cdot (y_{pred} - y) \\cdot x_1\\end{aligned}ηw1L(W)=η(ypredy)x1,当前馈计算完成后,ypredy_{pred}ypred已知项y,x1y,x_1y,x1也均为已知项。即便权重均初始化为000,也并不影响梯度的反向传播
并且ypredy_{pred}ypred即便所有权重均为000,经过Sigmoid\\text{Sigmoid}Sigmoid函数映射后的结果是0.50.50.5,对应梯度依然存在有效传播,对应权重依然正常更新。

因而在逻辑回归中使用零初始化权重是可行的。

神经网络是否可以使用零初始化权重???

为了和逻辑回归进行比较,我们使用一个包含一个隐藏层的神经网络处理二分类任务。对应模型结构表示如下:
神经网络——模型结构
这里依然省略偏置信息。各层之间使用Sigmoid\\text{Sigmoid}Sigmoid函数作为激活函数;损失函数依然使用交叉熵。观察该神经网络的前馈运算过程
Hidden Layer : {h1=Sigmoid(w11⋅x1+w21⋅x2)h2=Sigmoid(w12⋅x1+w22⋅x2)Output Layer : ypred=Sigmoid(w31⋅h1+w32⋅h2)\\begin{aligned} & \\text{Hidden Layer : }\\begin{cases} h_1 = \\text{Sigmoid}(w_{11} \\cdot x_1 + w_{21} \\cdot x_2) \\\\ h_2 = \\text{Sigmoid}(w_{12} \\cdot x_1 + w_{22} \\cdot x_2) \\end{cases} \\\\ & \\text{Output Layer : } \\quad y_{pred} = \\text{Sigmoid}(w_{31} \\cdot h_1 + w_{32} \\cdot h_2) \\end{aligned}Hidden Layer : {h1=Sigmoid(w11x1+w21x2)h2=Sigmoid(w12x1+w22x2)Output Layer : ypred=Sigmoid(w31h1+w32h2)
对应输出结点以及权重的反向传播过程表示如下:
Output Layer : {∂L(W)∂ypred=−yypred+1−y1−ypred∂L(W)∂w31=∂L(W)∂ypred⋅∂ypred∂w31=(ypred−y)⋅h1∂L(W)∂w32=∂L(W)∂ypred⋅∂ypred∂w32=(ypred−y)⋅h2Hidden Layer : {∂L(W)∂w11=∂L(W)∂ypred⋅∂ypred∂h1⋅∂h1∂w11=(ypred−y)⋅w31⋅h1(1−h1)⋅x1∂L(W)∂w12=∂L(W)∂ypred⋅∂ypred∂h2⋅∂h2∂w12=(ypred−y)⋅w32⋅h2(1−h2)⋅x1∂L(W)∂w21=∂L(W)∂ypred⋅∂ypred∂h1⋅∂h1∂w21=(ypred−y)⋅w31⋅h1(1−h1)⋅x2∂L(W)∂w22=∂L(W)∂ypred⋅∂ypred∂h2⋅∂h2∂w22=(ypred−y)⋅w32⋅h2(1−h2)⋅x2\\begin{aligned} & \\text{Output Layer : }\\begin{cases} \\begin{aligned} & \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial y_{pred}} = - \\frac{y}{y_{pred}} + \\frac{1 - y}{1 - y_{pred}} \\end{aligned} \\\\ \\begin{aligned} \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial w_{31}} & = \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial y_{pred}} \\cdot \\frac{\\partial y_{pred}}{\\partial w_{31}} = (y_{pred} - y) \\cdot h_1 \\end{aligned} \\\\ \\begin{aligned} \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial w_{32}} = \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial y_{pred}} \\cdot \\frac{\\partial y_{pred}}{\\partial w_{32}} = (y_{pred} - y) \\cdot h_2 \\end{aligned} \\end{cases} \\\\ & \\text{Hidden Layer : }\\begin{cases} \\begin{aligned} \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial w_{11}} = \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial y_{pred}} \\cdot \\frac{\\partial y_{pred}}{\\partial h_1} \\cdot \\frac{\\partial h_1}{\\partial w_{11}} = (y_{pred} - y) \\cdot w_{31} \\cdot h_1(1 - h_1) \\cdot x_1 \\end{aligned} \\\\ \\begin{aligned} \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial w_{12}} = \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial y_{pred}} \\cdot \\frac{\\partial y_{pred}}{\\partial h_2} \\cdot \\frac{\\partial h_2}{\\partial w_{12}} = (y_{pred} - y) \\cdot w_{32} \\cdot h_2(1 - h_2) \\cdot x_1 \\end{aligned} \\\\ \\begin{aligned} \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial w_{21}} = \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial y_{pred}} \\cdot \\frac{\\partial y_{pred}}{\\partial h_1} \\cdot \\frac{\\partial h_1}{\\partial w_{21}} = (y_{pred} - y) \\cdot w_{31} \\cdot h_1(1 - h_1) \\cdot x_2 \\end{aligned} \\\\ \\begin{aligned} \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial w_{22}} = \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial y_{pred}} \\cdot \\frac{\\partial y_{pred}}{\\partial h_2} \\cdot \\frac{\\partial h_2}{\\partial w_{22}} = (y_{pred} - y) \\cdot w_{32} \\cdot h_2(1 - h_2) \\cdot x_2 \\end{aligned} \\end{cases} \\end{aligned}Output Layer : ypredL(W)=ypredy+1ypred1yw31L(W)=ypredL(W)w31ypred=(ypredy)h1w32L(W)=ypredL(W)w32ypred=(ypredy)h2Hidden Layer : w11L(W)=ypredL(W)h1ypredw11h1=(ypredy)w31h1(1h1)x1w12L(W)=ypredL(W)h2ypredw12h2=(ypredy)w32h2(1h2)x1w21L(W)=ypredL(W)h1ypredw21h1=(ypredy)w31h1(1h1)x2w22L(W)=ypredL(W)h2ypredw22h2=(ypredy)w32h2(1h2)x2
这里一共涉及到了666个权重信息:w11,w12,w21,w22,w31,w32w_{11},w_{12},w_{21},w_{22},w_{31},w_{32}w11,w12,w21,w22,w31,w32。假设这些权重初始化均为000时,观察它的前馈计算过程与反向传播过程:
前馈计算过程:h1=h2=ypred=12h_1 = h_2 = y_{pred} = \\begin{aligned}\\frac{1}{2}\\end{aligned}h1=h2=ypred=21
反向传播过程:

  • 输出层:由于前馈计算h1=h2=ypredh_1 = h_2 = y_{pred}h1=h2=ypred,针对同一标签yyy反向传播时,∂L(W)∂w31=∂L(W)∂w32\\begin{aligned}\\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial w_{31}} = \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial w_{32}}\\end{aligned}w31L(W)=w32L(W)。这意味着权重w31,w32w_{31},w_{32}w31,w32的更新结果均相同
    w32w_{32}w32同理。因为w31=w32=0w_{31} = w_{32} = 0w31=w32=0。其更新结果有值,并且两权重的更新结果完全相同。
    w31⇐w31−η⋅∂L(W)∂w31=−12η⋅(12−y)\\begin{aligned} w_{31} \\Leftarrow w_{31} - \\eta \\cdot \\frac{\\partial \\mathcal L(\\mathcal W)}{\\partial w_{31}} = - \\frac{1}{2} \\eta \\cdot \\left(\\frac{1}{2} - y\\right) \\end{aligned}w31w31ηw31L(W)=21η(21y)
  • 隐藏层:根据上面的梯度结果,无论是w11,w12,w21,w22w_{11},w_{12},w_{21},w_{22}w11,w12,w21,w22哪一个权重的更新,由于初始状态w31,w32=0w_{31},w_{32} = 0w31,w32=0,它们的更新结果均为000
    这里以w11w_{11}w11示例。反向传播过程中,梯度并不是实时更新,而是将所有梯度结果计算完之后,再下一次迭代中更新。
    w11⇐w11−η⋅∂L(W)∂w11=0−η⋅(12−y)⋅0⋅12⋅12⋅x1=0\\begin{aligned} w_{11} & \\Leftarrow w_{11} - \\eta \\cdot \\frac{\\partial\\mathcal L(\\mathcal W)}{\\partial w_{11}} \\\\ & = 0 - \\eta \\cdot \\left(\\frac{1}{2} - y\\right) \\cdot 0 \\cdot \\frac{1}{2} \\cdot \\frac{1}{2} \\cdot x_1 \\\\ & = 0 \\end{aligned}w11w11ηw11L(W)=0η(21y)02121x1=0

至此,第一次迭代权重的更新结果表示为:
{w31=w32=−12η⋅(12−y)w11=w12=w21=w22=0\\begin{cases} \\begin{aligned} & w_{31} = w_{32} = -\\frac{1}{2} \\eta \\cdot \\left(\\frac{1}{2} - y\\right) \\\\ & w_{11} = w_{12} = w_{21} = w_{22} = 0 \\end{aligned} \\end{cases}w31=w32=21η(21y)w11=w12=w21=w22=0
第二次迭代同理,只不过w31=w32w_{31}=w_{32}w31=w32并有非零数值了,而其余权重均为000。这导致h1=h2h_1 = h_2h1=h2,从而导致更新后的权重出现如下情况:
{w31=w32w11=w12=w21=w22\\begin{cases} w_{31} = w_{32} \\\\ w_{11} = w_{12} = w_{21} = w_{22} \\end{cases}{w31=w32w11=w12=w21=w22
后续迭代同理。这意味着:各层神经元的梯度的更新结果均相同,从而导致同层神经元的输出结果全部一致。这自然是不合理的。因而关于神经网络的权重初始化不能使用零初始化

实际上,逻辑回归神经网络对于零初始化权重的区别,本质上是:在进行梯度计算的过程中,其梯度是否存在其他权重参与计算。从这个逻辑观察,只要存在至少一个隐藏层,梯度必然存在其他权重干预的情况。

相关参考:
神经网络权重为什么不能初始化为0?