| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 《机器学习》学习笔记5:神经网络与反向传播 -> 正文阅读 |
|
[人工智能]《机器学习》学习笔记5:神经网络与反向传播 |
Week5 神经网络与反向传播 W5 神经网络 反向传播9 神经网络的学习(Neural Networks: Learning)新符号标记:
L L L表示神经网络的层数; S l S_l Sl?表示第 l l l层神经元的个数(不包括偏置单元); K K K表示输出层单元的个数(即分类的类数、输入向量的维数), k k k代表第 k k k个单元。 9.1 神经网络的代价函数在逻辑回归中,输出值 h θ ( x ) h_\theta \left( x \right) hθ?(x)只有一个,一组训练集中也只有一个 y y y。代价函数为: J ( θ ) = 1 m ∑ i = 1 m [ ? y ( i ) log ? ( h θ ( x ( i ) ) ) ? ( 1 ? y ( i ) ) log ? ( 1 ? h θ ( x ( i ) ) ) ] + λ 2 m ∑ j = 1 n θ j 2 J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{[-{{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]}+\frac{\lambda }{2m}\sum\limits_{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 ) h_\theta(x) hθ?(x)和一组训练集中的 y y y是一个维度为 K K K的向量,因此我们的代价函数会比逻辑回归更加复杂一些: J ( Θ ) = ? 1 m [ ∑ i = 1 m ∑ k = 1 K y k ( i ) log ? ( h Θ ( x ( i ) ) ) k + ( 1 ? y k ( i ) ) log ? ( 1 ? ( h Θ ( x ( i ) ) ) k ) ] + λ 2 m ∑ l = 1 L ? 1 ∑ i = 1 s l ∑ j = 1 s l + 1 ( Θ j i ( l ) ) 2 J(\Theta) = -\frac{1}{m} \left[ \sum\limits_{i=1}^{m} \sum\limits_{k=1}^{K} {y_k}^{(i)} \log {(h_\Theta(x^{(i)}))}_k + \left( 1 - y_k^{(i)} \right) \log \left( 1- {\left( h_\Theta \left( x^{(i)} \right) \right)_k} \right) \right] + \frac{\lambda}{2m} \sum\limits_{l=1}^{L-1} \sum\limits_{i=1}^{s_l} \sum\limits_{j=1}^{s_{l+1}} \left( \Theta_{ji}^{(l)} \right)^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(l)?)2 其中:
∑
k
=
1
K
\sum\limits_{k=1}^{K}
k=1∑K?代表将K个输出单元每一个的代价函数都加起来;正则化项
λ
2
m
∑
l
=
1
L
?
1
∑
i
=
1
s
l
∑
j
=
1
s
l
+
1
(
Θ
j
i
(
l
)
)
2
\frac{\lambda}{2m} \sum\limits_{l=1}^{L-1} \sum\limits_{i=1}^{s_l} \sum\limits_{j=1}^{s_{l+1}} \left( \Theta_{ji}^{(l)} \right)^2
2mλ?l=1∑L?1?i=1∑sl??j=1∑sl+1??(Θji(l)?)2表示每一层
Θ
\Theta
Θ矩阵参数的平方和(排除偏置
θ
0
\theta_0
θ0?后),
i
i
i循环每层中的所有列(由本层
S
l
S_l
Sl?层激活单元数决定),
j
j
j循环每层中的所有行(由下一层
S
l
+
1
S_{l+1}
Sl+1?层激活单元数决定)。 9.2 反向传播算法(Backpropagation Algorithm)这里吴恩达老师讲得不是很清楚,详细过程和推导见我上一篇博客: 在第四周的神经网络概述中,我们采用了一种正向传播方法。现在,为了最小化代价函数,需要计算代价函数的偏导数 ? ? Θ i j ( l ) J ( Θ ) \frac{\partial}{\partial\Theta^{(l)}_{ij}}J\left(\Theta\right) ?Θij(l)???J(Θ),这时就要采用反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。 j j j 代表目前计算层中的激活单元的下标,也将是下一层的第 j j j个输入变量的下标。 i i i 代表下一层中误差单元的下标,是受到权重矩阵中第 i i i行影响的下一层中的误差单元的下标。 具体过程如下: 对于某一组训练数据 ( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) (x(i),y(i)), 首先第一层的激活值 a ( 1 ) = x ( i ) a^{(1)}=x^{(i)} a(1)=x(i),使用正向传播算法,计算出每一层的加权和 z ( l ) z^{(l)} z(l)和激活值 a ( l ) a^{(l)} a(l), 然后利用最后一层的激活值 a ( L ) a^{(L)} a(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 ? 1 ) ) T δ ( L ) ? g ′ ( z ( L ? 1 ) ) \delta^{(L-1)}=\left({\Theta^{(L-1)}}\right)^{T}\delta^{(L)}\ast g'\left(z^{(L-1)}\right) δ(L?1)=(Θ(L?1))Tδ(L)?g′(z(L?1)), 若 g g g为逻辑函数, g ′ ( z ( L ? 1 ) ) = a ( L ? 1 ) ? ? ( 1 ? a ( L ? 1 ) ) g'(z^{(L-1)})=a^{(L-1)}·*(1-a^{(L-1)}) g′(z(L?1))=a(L?1)??(1?a(L?1)) 继续求前一层误差,直到到第二层。 (实际上 l l l层误差第 j j j项 δ j ( l ) = ? C ? z j ( l ) \delta^{(l)}_j=\frac{\partial C}{\partial {z^{(l)}_j}} δj(l)?=?zj(l)??C?,假设 λ = 0 λ=0 λ=0,即我们不做任何正则化处理时有: ? ? Θ i j ( l ) J ( Θ ) = a j ( l ) δ i l + 1 \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta)=a_{j}^{(l)} \delta_{i}^{l+1} ?Θij(l)???J(Θ)=aj(l)?δil+1?) 将所有训练数据 的加起来即为
?
?
Θ
i
j
(
l
)
J
(
Θ
)
\frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta)
?Θij(l)???J(Θ),再用梯度下降或其他优化方法即可。 9.3 梯度检验对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。为了避免这样的问题,我们采取一种叫做梯度检验 (Numerical Gradient Checking )方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。 在代价函数上对于某个特定的**实数 ** θ \theta θ,沿着切线的方向,我们计算出在 θ ? ε \theta-\varepsilon θ?ε 处和 θ + ε \theta+\varepsilon θ+ε 的代价值( ε \varepsilon ε是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在 θ \theta θ 处的代价值,即: ? J ( θ ) ? θ 1 = J ( θ + ε ) ? J ( θ ? ε ) 2 ε \frac{\partial J(\theta)}{\partial\theta_1}=\frac{J\left(\theta+\varepsilon\right)-J \left( \theta-\varepsilon \right)}{2\varepsilon} ?θ1??J(θ)?=2εJ(θ+ε)?J(θ?ε)? 若 θ \theta θ是一个向量,则需要计算偏导数来检验: ? J ( θ ) ? θ 1 = J ( θ 1 + ε 1 , θ 2 , θ 3 . . . θ n ) ? J ( θ 1 ? ε 1 , θ 2 , θ 3 . . . θ n ) 2 ε \frac{\partial J(\theta)}{\partial\theta_1}=\frac{J\left(\theta_1+\varepsilon_1,\theta_2,\theta_3...\theta_n \right)-J \left( \theta_1-\varepsilon_1,\theta_2,\theta_3...\theta_n \right)}{2\varepsilon} ?θ1??J(θ)?=2εJ(θ1?+ε1?,θ2?,θ3?...θn?)?J(θ1??ε1?,θ2?,θ3?...θn?)? ? J ( θ ) ? θ 2 = J ( θ 1 , θ 2 + ε 2 , θ 3 . . . θ n ) ? J ( θ 1 , θ 2 ? ε 2 , θ 3 . . . θ n ) 2 ε \frac{\partial J(\theta)}{\partial\theta_2}=\frac{J\left(\theta_1,\theta_2+\varepsilon_2,\theta_3...\theta_n \right)-J \left( \theta_1,\theta_2-\varepsilon_2,\theta_3...\theta_n \right)}{2\varepsilon} ?θ2??J(θ)?=2εJ(θ1?,θ2?+ε2?,θ3?...θn?)?J(θ1?,θ2??ε2?,θ3?...θn?)? . . . . . . ...... ...... 最后将梯度检验计算的结果与反向传播计算的结果进行比较,看是否得到相似的值。 检验完后运行梯度下降时,需要关闭梯度检验,因为求偏导计算量过大,每此都求会运行速度极慢。而反向传播则是计算梯度的高效算法。 9.4 随机初始化参数初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。 如果我们令所有的初始参数都为0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都相同的数,结果也是一样的。 所以我们通常初始参数为正负 ε ε ε之间的随机值(0-1随机值 × 2 ε ? ×2ε- ×2ε? ε ε ε),例如10×11的参数矩阵:
9.5 神经网络总结使用神经网络时的步骤: 选择网络结构: 即决定选择多少层以及决定每层分别有多少个单元。第一层的单元数即我们训练集的特征数量,最后一层的单元数是我们训练集的结果的类的数量。 如果隐藏层数大于1,确保每个隐藏层的单元个数相同 ,最好为第一层个数整数倍,通常情况下隐藏层单元的个数越多越好,但太多会增加计算量。 训练神经网络:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 10:29:51- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |