Skip to content

Commit

Permalink
Fix issue #68.
Browse files Browse the repository at this point in the history
  • Loading branch information
zhanggyb committed Feb 13, 2018
1 parent 440dde6 commit d2fdaee
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 20 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,6 @@ auto
*.gls
*.glo
*.glg
*.fdb_latexmk
*.fls
*.synctex.gz
35 changes: 17 additions & 18 deletions chap3.tex
Original file line number Diff line number Diff line change
Expand Up @@ -860,8 +860,7 @@ \subsection{正则化}
\end{equation}

其中第一个项就是常规的交叉熵的表达式。第二个现在加入的就是所有\gls*{weight}的平方的和。然
后使用一个因子 $\lambda / 2n$ 进行量化调整,其中 $\lambda > 0$ 可以称为\textbf{
范化参数},而 $n$ 就是训练集合的大小。我们会在后面讨论
后使用一个因子 $\lambda / 2n$ 进行量化调整,其中 $\lambda > 0$ 可以称为\textbf{\gls*{regularization}参数},而 $n$ 就是训练集合的大小。我们会在后面讨论
$\lambda$ 的选择策略。需要注意的是,\gls*{regularization}项里面并\textbf{}包含\gls*{bias}。这点我们后
面也会再讲述。

Expand Down Expand Up @@ -926,8 +925,8 @@ \subsection{正则化}
\sum_x \frac{\partial C_x}{\partial w}
\label{eq:93}\tag{93}
\end{equation}
其中后面一项是在训练样本的\gls*{mini-batch} $x$ 上进行的,而 $C_x$ 是对每个训练样本的(无规
范化的)代价。这其实和之前通常的\gls*{sgd}的规则是一样的,除了有一个\gls*{weight}下降
其中后面一项是在训练样本的\gls*{mini-batch} $x$ 上进行的,而 $C_x$ 是对每个训练样本的(\gls*{regularization}%
)代价。这其实和之前通常的\gls*{sgd}的规则是一样的,除了有一个\gls*{weight}下降
的因子 $1-\frac{\eta \lambda}{n}$。最后,为了完整,我给出\gls*{bias}的\gls*{regularization}的学习规则。
这当然是和我们之前的非\gls*{regularization}的情形一致了(参考公式~\eqref{eq:21}),
\begin{equation}
Expand All @@ -937,8 +936,8 @@ \subsection{正则化}
这里求和也是在训练样本的\gls*{mini-batch} $x$ 上进行的。

让我们看看\gls*{regularization}给网络带来的性能提升吧。这里还会使用有 $30$ 个隐藏神经元、\gls*{mini-batch}
大小为 $10$\gls*{learning-rate}为 $0.5$,使用交叉熵的神经网络。然而,这次我们会使用规
范化参数为 $\lambda = 0.1$。注意在代码中,我们使用的变量名字为 \lstinline!lmbda!,
大小为 $10$\gls*{learning-rate}为 $0.5$,使用交叉熵的神经网络。然而,这次我们会使用\gls*{regularization}%
参数为 $\lambda = 0.1$。注意在代码中,我们使用的变量名字为 \lstinline!lmbda!,
这是因为在 Python 中 \lstinline!lambda! 是关键字,有着不相关的含义。我也会再次使
\lstinline!test_data!,而不是 \lstinline!validation_data!。不过严格地讲,我们
应当使用 \lstinline!validation_data! 的,因为前面已经讲过了。这里我这样做,是因
Expand Down Expand Up @@ -977,8 +976,8 @@ \subsection{正则化}
轻了\gls*{overfitting}的影响。

如果我们摆脱人为的仅用 1,000 个训练图像的环境,转而用所有 50,000 图像的训练集,
会发生什么?当然,我们之前已经看到\gls*{overfitting}在大规模的数据上其实不是那么明显了。那规
范化能不能起到相应的作用呢?保持超参数和之前一样,30 \gls*{epoch}, \gls*{learning-rate}为 0.5,
会发生什么?当然,我们之前已经看到\gls*{overfitting}在大规模的数据上其实不是那么明显了。%
\gls*{regularization}能不能起到相应的作用呢?保持超参数和之前一样,30 \gls*{epoch}, \gls*{learning-rate}为 0.5,
\gls*{mini-batch}大小为 10。不过我们这里需要改变\gls*{regularization}参数。原因在于训练数据的大小已
经从 $n=1,000$ 改成了 $n=50,000$,这个会改变\gls*{weight}衰减因子
$1-\frac{\eta\lambda}{n}$。如果我们持续使用 $\lambda = 0.1$ 就会产生很小的\gls*{weight}衰
Expand Down Expand Up @@ -1117,8 +1116,8 @@ \subsection{为何正则化可以帮助减轻过度拟合}
化的网络中。更小的\gls*{weight}意味着网络的行为不会因为我们随便改变了一个输入而改变太大。
这会让\gls*{regularization}网络学习局部噪声的影响更加困难。将它看做是一种让单个的证据不会影响网
络输出太多的方式。相对的,\gls*{regularization}网络学习去对整个训练集中经常出现的证据进行反应。
对比看,大\gls*{weight}的网络可能会因为输入的微小改变而产生比较大的行为改变。所以一个无规
范化的网络可以使用大的\gls*{weight}来学习包含训练数据中的噪声的大量信息的复杂模型。简言之,
对比看,大\gls*{weight}的网络可能会因为输入的微小改变而产生比较大的行为改变。所以一个无\gls*{regularization}%
的网络可以使用大的\gls*{weight}来学习包含训练数据中的噪声的大量信息的复杂模型。简言之,
\gls*{regularization}网络受限于根据训练数据中常见的模式来构造相对简单的模型,而能够抵抗训练数据
中的噪声的特性影响。我们的想法就是这可以让我们的网络对看到的现象进行真实的学习,
并能够根据已经学到的知识更好地进行泛化。
Expand Down Expand Up @@ -1160,8 +1159,8 @@ \subsection{为何正则化可以帮助减轻过度拟合}
导!第三,对模型真正的测试不是简单性,而是它在新场景中对新的活动中的预测能力。

所以,我们应当时时记住这一点,\gls*{regularization}的神经网络常常能够比非\gls*{regularization}的泛化能力更强,
这只是一种实验事实(empirical fact)。所以,本书剩下的内容,我们也会频繁地使用规
范化技术。我已经在上面讲过了为何现在还没有一个人能够发展出一整套具有说服力的关于
这只是一种实验事实(empirical fact)。所以,本书剩下的内容,我们也会频繁地使用\gls*{regularization}%
技术。我已经在上面讲过了为何现在还没有一个人能够发展出一整套具有说服力的关于
\gls*{regularization}可以帮助网络泛化的理论解释。实际上,研究者们不断地在写自己尝试不同的\gls*{regularization}
方法,然后看看哪种表现更好,尝试理解为何不同的观点表现的更好。所以你可以将\gls*{regularization}
看做某种任意整合的技术。尽管其效果不错,但我们并没有一套完整的关于所发生情况的理
Expand Down Expand Up @@ -1288,8 +1287,8 @@ \subsection{正则化的其他技术}
一半的隐藏神经元被\gls*{dropout}的情形下学到的。当我们实际运行整个网络时,是指两倍的隐藏神
经元将会被激活。为了补偿这个,我们将从隐藏神经元出去的\gls*{weight}减半。

这个\gls*{dropout}过程可能看起来奇怪,像是临时安排的。为什么我们会指望这样的方法能够进行规
范化呢?为了解释所发生的事,我希望你停下来想一下标准(没有\gls*{dropout})的训练方式。
这个\gls*{dropout}过程可能看起来奇怪,像是临时安排的。为什么我们会指望这样的方法能够进行\gls*{regularization}%
?为了解释所发生的事,我希望你停下来想一下标准(没有\gls*{dropout})的训练方式。
特别地,想象一下我们训练几个不同的神经网络,都使用同一个训练数据。当然,网络可能
不是从同一初始状态开始的,最终的结果也会有一些差异。出现这种情况时,我们可以使用
一些平均或者投票的方式来确定接受哪个输出。例如,如果我们训练了五个网络,其中三个
Expand Down Expand Up @@ -1704,8 +1703,8 @@ \section{再看手写识别问题:代码}
\end{lstlisting}

现在,我们理解了 \lstinline!network2.py! 和 \lstinline!network.py! 两个实现之间
的主要差别。都是很简单的东西。还有一些更小的变动,下面我们会进行介绍,包含 L2
范化的实现。在讲述\gls*{regularization}之前,我们看看 \lstinline!network2.py! 完整的实现代码。
的主要差别。都是很简单的东西。还有一些更小的变动,下面我们会进行介绍,包含 L2 \gls*{regularization}%
的实现。在讲述\gls*{regularization}之前,我们看看 \lstinline!network2.py! 完整的实现代码。
你不需要太仔细地读遍这些代码,但是对整个结构尤其是文档中的内容的理解是非常重要的,
这样,你就可以理解每段程序所做的工作。当然,你也可以随自己意愿去深入研究!如果你
迷失了理解,那么请读读下面的讲解,然后再回到代码中。不多说了,给代码:
Expand All @@ -1718,8 +1717,8 @@ \section{再看手写识别问题:代码}
\lstinline!Network.update_mini_batch! 的倒数第四行。这就是我们改动梯度下降规则来
进行\gls*{weight}下降的地方。尽管改动很小,但其对结果影响却很大!

其实这种情况在神经网络中实现一些新技术的常见现象。我们花费了近千字的篇幅来讨论规
范化。概念的理解非常微妙困难。但是添加到程序中的时候却如此简单。精妙复杂的技术可
其实这种情况在神经网络中实现一些新技术的常见现象。我们花费了近千字的篇幅来讨论\gls*{regularization}。
概念的理解非常微妙困难。但是添加到程序中的时候却如此简单。精妙复杂的技术可
以通过微小的代码改动就可以实现了。

另一个微小却重要的改动是\gls*{sgd}方法的几个标志位的增加。这些标志位让我们可以
Expand Down
4 changes: 2 additions & 2 deletions chap6.tex
Original file line number Diff line number Diff line change
Expand Up @@ -648,8 +648,8 @@ \subsection*{问题}

\label{final_conv}
这里发生了什么事?扩展的,或者额外的全连接层真的对 MNIST 没帮助吗?或者说,我们
的网络有能力做得更好,但我们在用错误的方式学习?例如,也许我们可以用更强有力的规
范化技术来减小\gls*{overfitting}的趋势。一种可能性是第三章介绍的%
的网络有能力做得更好,但我们在用错误的方式学习?例如,也许我们可以用更强有力的\gls*{regularization}%
技术来减小\gls*{overfitting}的趋势。一种可能性是第三章介绍的%
\hyperref[sec:other_techniques_for_regularization]{弃权}技术。回想弃权的基本思想
是在训练网络时随机地移除单独的激活值。这使得模型对单独依据的丢失更为强劲,因此不
太可能依赖于训练数据的特质。让我们试着应用弃权到最终的全连接层:
Expand Down

0 comments on commit d2fdaee

Please sign in to comment.