diff --git a/微积分/第10章 微分方程.md b/微积分/第10章 微分方程.md new file mode 100644 index 00000000..e69de29b diff --git a/微积分/第11章 差分方程.md b/微积分/第11章 差分方程.md new file mode 100644 index 00000000..e69de29b diff --git a/微积分/第1章 函数.md b/微积分/第1章 函数.md new file mode 100644 index 00000000..e69de29b diff --git a/微积分/极限.md b/微积分/第2章 极限和连续.md similarity index 100% rename from 微积分/极限.md rename to 微积分/第2章 极限和连续.md diff --git a/微积分/第3章 导数和微分.md b/微积分/第3章 导数和微分.md new file mode 100644 index 00000000..e69de29b diff --git a/微积分/第4章 微分中值定理与导数应用.md b/微积分/第4章 微分中值定理与导数应用.md new file mode 100644 index 00000000..e69de29b diff --git a/微积分/不定积分.md b/微积分/第5章 不定积分.md similarity index 100% rename from 微积分/不定积分.md rename to 微积分/第5章 不定积分.md diff --git a/微积分/定积分.md b/微积分/第6章 定积分.md similarity index 97% rename from 微积分/定积分.md rename to 微积分/第6章 定积分.md index 1fd230d2..293a87a9 100644 --- a/微积分/定积分.md +++ b/微积分/第6章 定积分.md @@ -99,3 +99,11 @@ $$ \end{aligned} $$ + + +### 变量替换公式 + +$$ +\int_a^bf(x)dx=\int_\alpha^\beta f(\varphi(t))\varphi'(t)dt \\ +\varphi(\alpha)=a,\varphi(\beta)=b +$$ \ No newline at end of file diff --git a/微积分/第7章 空间解析几何与向量代数.md b/微积分/第7章 空间解析几何与向量代数.md new file mode 100644 index 00000000..e69de29b diff --git a/微积分/曲线积分与平面积分.md b/微积分/第8章 多元函数微积分.md similarity index 100% rename from 微积分/曲线积分与平面积分.md rename to 微积分/第8章 多元函数微积分.md diff --git a/微积分/第9章 无穷级数.md b/微积分/第9章 无穷级数.md new file mode 100644 index 00000000..e69de29b diff --git a/微积分/第一节 .md b/微积分/第一节 .md deleted file mode 100644 index e3eac1cd..00000000 --- a/微积分/第一节 .md +++ /dev/null @@ -1,8 +0,0 @@ - - -### 变量替换公式 - -$$ -\int_a^bf(x)dx=\int_\alpha^\beta f(\varphi(t))\varphi'(t)dt \\ -\varphi(\alpha)=a,\varphi(\beta)=b -$$ \ No newline at end of file diff --git a/微积分/附录1:三角函数公式.md b/微积分/附录1:三角函数公式.md new file mode 100644 index 00000000..e69de29b diff --git a/机器学习/吴恩达深度学习/学习笔记/Improving_Deep_Neural_Networks/01深度学习的实用层面.md b/机器学习/吴恩达深度学习/学习笔记/Improving_Deep_Neural_Networks/01深度学习的实用层面.md index 8e0265bc..bfb960ec 100644 --- a/机器学习/吴恩达深度学习/学习笔记/Improving_Deep_Neural_Networks/01深度学习的实用层面.md +++ b/机器学习/吴恩达深度学习/学习笔记/Improving_Deep_Neural_Networks/01深度学习的实用层面.md @@ -1,5 +1,9 @@ # 深度学习的实用层面 +> * [笔记模板](https://github.com/bighuang624/Andrew-Ng-Deep-Learning-notes) +> * 相关的笔记都可以在github上先找到相关的笔记然后再修改,方便。 + + ## 数据划分:训练 / 验证 / 测试集 * 应用深度学习是一个典型的迭代过程。 diff --git a/机器学习/吴恩达深度学习/学习笔记/Improving_Deep_Neural_Networks/03超参数调试、Batch正则化和程序框架.md b/机器学习/吴恩达深度学习/学习笔记/Improving_Deep_Neural_Networks/03超参数调试、Batch正则化和程序框架.md index 6390d59a..4759d054 100644 --- a/机器学习/吴恩达深度学习/学习笔记/Improving_Deep_Neural_Networks/03超参数调试、Batch正则化和程序框架.md +++ b/机器学习/吴恩达深度学习/学习笔记/Improving_Deep_Neural_Networks/03超参数调试、Batch正则化和程序框架.md @@ -2,9 +2,8 @@ ## 超参数调试处理 -### 重要程度排序 +### 超参数重要程度排序 -目前已经讲到过的超参数中,重要程度依次是(仅供参考): * **最重要**: * 学习率 α; @@ -21,17 +20,20 @@ ### 调参技巧 -系统地组织超参调试过程的技巧: * **随机选择**点(而非均匀选取),用这些点实验超参数的效果。这样做的原因是我们提前很难知道超参数的重要程度,可以通过选择更多值来进行更多实验; * 由粗糙到精细:聚焦效果不错的点组成的小区域,在其中更密集地取值,以此类推; ### 选择合适的范围 -* 对于学习率 α,用**对数标尺**而非线性轴更加合理:0.0001、0.001、0.01、0.1 等,然后在这些刻度之间再随机均匀取值; +* 对于学习率 α,用**对数标尺**而非线性轴更加合理:0.0001、0.001、0.01、0.1 等,然后在这些刻度之间对log值进行均匀选择。 * 对于 β,取 0.9 就相当于在 10 个值中计算平均值,而取 0.999 就相当于在 1000 个值中计算平均值。可以考虑给 1-β 取值,这样就和取学习率类似了。 +* 上述操作的原因是当 β 接近 1 时,即使 β 只有微小的改变,所得结果的灵敏度会有较大的变化。例如,β 从 0.9 增加到 0.9005 对结果(1/(1-β))几乎没有影响,而 β 从 0.999 到 0.9995 对结果的影响巨大(从 1000 个值中计算平均值变为 2000 个值中计算平均值)。 -上述操作的原因是当 β 接近 1 时,即使 β 只有微小的改变,所得结果的灵敏度会有较大的变化。例如,β 从 0.9 增加到 0.9005 对结果(1/(1-β))几乎没有影响,而 β 从 0.999 到 0.9995 对结果的影响巨大(从 1000 个值中计算平均值变为 2000 个值中计算平均值)。 +```py +r = -4 * np.random.rand() +alpha = 10^r # 表示在对数值上的均匀分布 r log 10,r均匀分布 +``` ### 一些建议 @@ -41,112 +43,111 @@ * Panda(熊猫方式):在在线广告设置或者在计算机视觉应用领域有大量的数据,但受计算能力所限,同时试验大量模型比较困难。可以采用这种方式:试验一个或一小批模型,初始化,试着让其工作运转,观察它的表现,不断调整参数; * Caviar(鱼子酱方式):拥有足够的计算机去平行试验很多模型,尝试很多不同的超参数,选取效果最好的模型; -## Batch Normalization +## Batch Normalization归一化 -**批标准化(Batch Normalization,经常简称为 BN)**会使参数搜索问题变得很容易,使神经网络对超参数的选择更加稳定,超参数的范围会更庞大,工作效果也很好,也会使训练更容易。 +### 归一化原理 -之前,我们对输入特征 X 使用了标准化处理。我们也可以用同样的思路处理**隐藏层**的激活值 $a^{[l]}$,以加速 $W^{[l+1]}$和 $b^{[l+1]}$的训练。在**实践**中,经常选择标准化 $Z^{[l]}$: +* **批标准化(Batch Normalization,经常简称为 BN)** 会使参数搜索问题变得很容易,使神经网络对超参数的选择更加稳定,超参数的范围会更庞大,工作效果也很好,也会使训练更容易。 -$$\mu = \frac{1}{m} \sum\_i z^{(i)}$$ -$$\sigma^2 = \frac{1}{m} \sum\_i {(z\_i - \mu)}^2$$ -$$z\_{norm}^{(i)} = \frac{z^{(i)} - \mu}{\sqrt{\sigma^2 + \epsilon}}$$ +* 之前,我们对输入特征 X 使用了标准化处理。我们也可以用同样的思路处理**隐藏层**的激活值 $a^{[l]}$,以加速 $W^{[l+1]}$和 $b^{[l+1]}$的训练。在**实践**中,经常选择标准化 $Z^{[l]}$: -其中,m 是单个 mini-batch 所包含的样本个数,ϵ 是为了防止分母为零,通常取 $10^{-8}$。 +$$\mu = \frac{1}{m} \sum_i z^{(i)}$$ +$$\sigma^2 = \frac{1}{m} \sum_i {(z_i - \mu)}^2$$ +$$z_{norm}^{(i)} = \frac{z^{(i)} - \mu}{\sqrt{\sigma^2 + \epsilon}}$$ -这样,我们使得所有的输入 $z^{(i)}$均值为 0,方差为 1。但我们不想让隐藏层单元总是含有平均值 0 和方差 1,也许隐藏层单元有了不同的分布会更有意义。因此,我们计算 +* 其中,m 是单个 mini-batch 所包含的样本个数,ϵ 是为了防止分母为零,通常取 $10^{-8}$。这样,我们使得所有的输入 $z^{(i)}$均值为 0,方差为 1。但我们不想让隐藏层单元总是含有平均值 0 和方差 1,也许隐藏层单元有了不同的分布会更有意义。因此,我们计算 -$$\tilde z^{(i)} = \gamma z^{(i)}\_{norm} + \beta$$ +$$\tilde z^{(i)} = \gamma z^{(i)}_{norm} + \beta$$ -其中,γ 和 β 都是模型的学习参数,所以可以用各种梯度下降算法来更新 γ 和 β 的值,如同更新神经网络的权重一样。 +* 其中,γ 和 β 都是模型的学习参数,所以可以用各种梯度下降算法来更新 γ 和 β 的值,如同更新神经网络的权重一样。通过对 γ 和 β 的合理设置,可以让 $\tilde z^{(i)}$的均值和方差为任意值。这样,我们对隐藏层的 $z^{(i)}$进行标准化处理,用得到的 $\tilde z^{(i)}$替代 $z^{(i)}$。 -通过对 γ 和 β 的合理设置,可以让 $\tilde z^{(i)}$的均值和方差为任意值。这样,我们对隐藏层的 $z^{(i)}$进行标准化处理,用得到的 $\tilde z^{(i)}$替代 $z^{(i)}$。 +* **设置 γ 和 β 的原因** 是,如果各隐藏层的输入均值在靠近 0 的区域,即处于激活函数的线性区域,不利于训练非线性神经网络,从而得到效果较差的模型。因此,需要用 γ 和 β 对标准化后的结果做进一步处理。 -**设置 γ 和 β 的原因**是,如果各隐藏层的输入均值在靠近 0 的区域,即处于激活函数的线性区域,不利于训练非线性神经网络,从而得到效果较差的模型。因此,需要用 γ 和 β 对标准化后的结果做进一步处理。 +### 将BN应用于神经网络 -### 将 BN 应用于神经网络 +* 对于 L 层神经网络,经过 Batch Normalization 的作用,整体流程如下: -对于 L 层神经网络,经过 Batch Normalization 的作用,整体流程如下: +![BN](BN.png) -![BN](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Improving_Deep_Neural_Networks/BN.png) +* 实际上,Batch Normalization 经常使用在 mini-batch 上,这也是其名称的由来。使用 Batch Normalization 时,因为标准化处理中包含减去均值的一步,因此 b 实际上没有起到作用,其数值效果交由 β 来实现。因此,在 Batch Normalization 中,可以省略 b 或者暂时设置为 0。 -实际上,Batch Normalization 经常使用在 mini-batch 上,这也是其名称的由来。 +* 在使用梯度下降算法时,分别对 $W^{[l]}$,$β^{[l]}$和 $γ^{[l]}$进行迭代更新。除了传统的梯度下降算法之外,还可以使用之前学过的动量梯度下降、RMSProp 或者 Adam 等优化算法。 -使用 Batch Normalization 时,因为标准化处理中包含减去均值的一步,因此 b 实际上没有起到作用,其数值效果交由 β 来实现。因此,在 Batch Normalization 中,可以省略 b 或者暂时设置为 0。 - -在使用梯度下降算法时,分别对 $W^{[l]}$,$β^{[l]}$和 $γ^{[l]}$进行迭代更新。除了传统的梯度下降算法之外,还可以使用之前学过的动量梯度下降、RMSProp 或者 Adam 等优化算法。 - -### BN 有效的原因 +### BN有效的原因 Batch Normalization 效果很好的原因有以下两点: 1. 通过对隐藏层各神经元的输入做类似的标准化处理,提高神经网络训练速度; 2. 可以使前面层的权重变化对后面层造成的影响减小,整体网络更加健壮。 -关于第二点,如果实际应用样本和训练样本的数据分布不同(例如,橘猫图片和黑猫图片),我们称发生了“**Covariate Shift**”。这种情况下,一般要对模型进行重新训练。Batch Normalization 的作用就是减小 Covariate Shift 所带来的影响,让模型变得更加健壮,鲁棒性(Robustness)更强。 +> 训练过程中的激活值,通过归一化,去除不同激活值之间尺度带来的影响,但是保留激活值变化产生的影响。即将激活值变化维持在固定的范围内,通过激活值的变化,得到不同的输出。输入激活值变化对输出的影响的重要程度,不是由本身尺度决定的,而是由权重参数决定。 +> 这里对Z进行归一化处理,可以消除前k层神经网络导致的输出值的尺度不同,仅仅由输入激活值的变动对输出值产生影响。而输入值的均值(截距)和输入值的变化范围(标准差)产生的影响,进行了归一化处理。 -即使输入的值改变了,由于 Batch Normalization 的作用,使得均值和方差保持不变(由 γ 和 β 决定),限制了在前层的参数更新对数值分布的影响程度,因此后层的学习变得更容易一些。Batch Normalization 减少了各层 W 和 b 之间的耦合性,让各层更加独立,实现自我训练学习的效果。 +### 说明 +* 关于第二点,如果实际应用样本和训练样本的数据分布不同(例如,橘猫图片和黑猫图片),我们称发生了“**Covariate Shift**”。这种情况下,一般要对模型进行重新训练。Batch Normalization 的作用就是减小 Covariate Shift 所带来的影响,让模型变得更加健壮,鲁棒性(Robustness)更强。 +* 即使输入的值改变了,由于 Batch Normalization 的作用,使得均值和方差保持不变(由 γ 和 β 决定),限制了在前层的参数更新对数值分布的影响程度,因此后层的学习变得更容易一些。Batch Normalization 减少了各层 W 和 b 之间的耦合性,让各层更加独立,实现自我训练学习的效果。 -另外,Batch Normalization 也**起到微弱的正则化**(regularization)效果。因为在每个 mini-batch 而非整个数据集上计算均值和方差,只由这一小部分数据估计得出的均值和方差会有一些噪声,因此最终计算出的 $\tilde z^{(i)}$也有一定噪声。类似于 dropout,这种噪声会使得神经元不会再特别依赖于任何一个输入特征。 +* 另外,Batch Normalization 也**起到微弱的正则化**(regularization)效果。因为在每个 mini-batch 而非整个数据集上计算均值和方差,只由这一小部分数据估计得出的均值和方差会有一些噪声,因此最终计算出的 $\tilde z^{(i)}$也有一定噪声。类似于 dropout,这种噪声会使得神经元不会再特别依赖于任何一个输入特征。 -因为 Batch Normalization 只有微弱的正则化效果,因此可以和 dropout 一起使用,以获得更强大的正则化效果。通过应用更大的 mini-batch 大小,可以减少噪声,从而减少这种正则化效果。 +* 因为 Batch Normalization 只有微弱的正则化效果,因此可以和 dropout 一起使用,以获得更强大的正则化效果。通过应用更大的 mini-batch 大小,可以减少噪声,从而减少这种正则化效果。 -最后,不要将 Batch Normalization 作为正则化的手段,而是当作加速学习的方式。正则化只是一种非期望的副作用,Batch Normalization 解决的还是反向传播过程中的梯度问题(梯度消失和爆炸)。 +* 最后,不要将 Batch Normalization 作为正则化的手段,而是当作加速学习的方式。正则化只是一种非期望的副作用,Batch Normalization 解决的还是反向传播过程中的梯度问题(梯度消失和爆炸)。 ### 测试时的 Batch Normalization -Batch Normalization 将数据以 mini-batch 的形式逐一处理,但在测试时,可能需要对每一个样本逐一处理,这样无法得到 μ 和 $σ^2$。 +* Batch Normalization 将数据以 mini-batch 的形式逐一处理,但在测试时,可能需要对每一个样本逐一处理,这样无法得到 μ 和 $σ^2$。 -理论上,我们可以将所有训练集放入最终的神经网络模型中,然后将每个隐藏层计算得到的 $μ^{[l]}$和 $σ^{2[l]}$直接作为测试过程的 μ 和 σ 来使用。但是,实际应用中一般不使用这种方法,而是使用之前学习过的指数加权平均的方法来预测测试过程单个样本的 μ 和 $σ^2$。 +* 理论上,我们可以将所有训练集放入最终的神经网络模型中,然后将每个隐藏层计算得到的 $μ^{[l]}$和 $σ^{2[l]}$直接作为测试过程的 μ 和 σ 来使用。但是,实际应用中一般不使用这种方法,而是使用之前学习过的指数加权平均的方法来预测测试过程单个样本的 μ 和 $σ^2$。 -对于第 l 层隐藏层,考虑所有 mini-batch 在该隐藏层下的 $μ^{[l]}$和 $σ^{2[l]}$,然后用指数加权平均的方式来预测得到当前单个样本的 $μ^{[l]}$和 $σ^{2[l]}$。这样就实现了对测试过程单个样本的均值和方差估计。 +* 对于第 l 层隐藏层,考虑所有 mini-batch 在该隐藏层下的 $μ^{[l]}$和 $σ^{2[l]}$,然后用指数加权平均的方式来预测得到当前单个样本的 $μ^{[l]}$和 $σ^{2[l]}$。这样就实现了对测试过程单个样本的均值和方差估计。 ## Softmax 回归 -目前为止,介绍的分类例子都是二分类问题:神经网络输出层只有一个神经元,表示预测输出 $\hat y$是正类的概率 P(y = 1|x),$\hat y$ > 0.5 则判断为正类,反之判断为负类。 +* 目前为止,介绍的分类例子都是二分类问题:神经网络输出层只有一个神经元,表示预测输出 $\hat y$是正类的概率 P(y = 1|x),$\hat y$ > 0.5 则判断为正类,反之判断为负类。 -对于**多分类问题**,用 C 表示种类个数,则神经网络输出层,也就是第 L 层的单元数量 $n^{[L]} = C$。每个神经元的输出依次对应属于该类的概率,即 $P(y = c|x), c = 0, 1, .., C-1$。有一种 Logistic 回归的一般形式,叫做 **Softmax 回归**,可以处理多分类问题。 +* 对于**多分类问题**,用 C 表示种类个数,则神经网络输出层,也就是第 L 层的单元数量 $n^{[L]} = C$。每个神经元的输出依次对应属于该类的概率,即 $P(y = c|x), c = 0, 1, .., C-1$。有一种 Logistic 回归的一般形式,叫做 **Softmax 回归**,可以处理多分类问题。 -对于 Softmax 回归模型的输出层,即第 L 层,有: +* 对于 Softmax 回归模型的输出层,即第 L 层,有: $$Z^{[L]} = W^{[L]}a^{[L-1]} + b^{[L]}$$ -for i in range(L),有: +* for i in range(L),有: -$$a^{[L]}\_i = \frac{e^{Z^{[L]}\_i}}{\sum^C\_{i=1}e^{Z^{[L]}\_i}}$$ +$$a^{[L]}_i = \frac{e^{Z^{[L]}_i}}{\sum^C_{i=1}e^{Z^{[L]}_i}}$$ -为输出层每个神经元的输出,对应属于该类的概率,满足: +* 为输出层每个神经元的输出,对应属于该类的概率,满足: -$$\sum^C\_{i=1}a^{[L]}\_i = 1$$ +$$\sum^C_{i=1}a^{[L]}_i = 1$$ -一个直观的计算例子如下: +* 一个直观的计算例子如下: -![understanding-softmax](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Improving_Deep_Neural_Networks/understanding-softmax.png) +![understanding-softmax](understanding-softmax.png) ### 损失函数和成本函数 -定义**损失函数**为: +1. 定义**损失函数**为: -$$L(\hat y, y) = -\sum^C\_{j=1}y\_jlog\hat y\_j$$ +$$L(\hat y, y) = -\sum^C_{j=1}y_jlog\hat y_j$$ -当 i 为样本真实类别,则有: +2. 当 i 为样本真实类别,则有: -$$y\_j = 0, j \ne i$$ +$$y_j = 0, j \ne i$$ -因此,损失函数可以简化为: +3. 因此,损失函数可以简化为: -$$L(\hat y, y) = -y\_ilog\hat y\_i = log \hat y\_i$$ +$$L(\hat y, y) = -y_ilog\hat y_i = log \hat y_i$$ -所有 m 个样本的**成本函数**为: +4. 所有 m 个样本的**成本函数**为: -$$J = \frac{1}{m}\sum^m\_{i=1}L(\hat y, y)$$ +$$J = \frac{1}{m}\sum^m_{i=1}L(\hat y, y)$$ ### 梯度下降法 -多分类的 Softmax 回归模型与二分类的 Logistic 回归模型只有输出层上有一点区别。经过不太一样的推导过程,仍有 +* 多分类的 Softmax 回归模型与二分类的 Logistic 回归模型只有输出层上有一点区别。经过不太一样的推导过程,仍有 $$dZ^{[L]} = A^{[L]} - Y$$ -反向传播过程的其他步骤也和 Logistic 回归的一致。 +* 反向传播过程的其他步骤也和 Logistic 回归的一致。 ### 参考资料 @@ -175,9 +176,7 @@ $$dZ^{[L]} = A^{[L]} - Y$$ ## Tensorflow -目前最火的深度学习框架大概是 Tensorflow 了。这里简单的介绍一下。 - -Tensorflow 框架内可以直接调用梯度下降算法,极大地降低了编程人员的工作量。例如以下代码: +* 目前最火的深度学习框架大概是 Tensorflow 了。这里简单的介绍一下。Tensorflow 框架内可以直接调用梯度下降算法,极大地降低了编程人员的工作量。例如以下代码: ```py import numpy as np @@ -200,9 +199,9 @@ for i in range(1000): print(session.run(w)) ``` -打印为 4.99999,基本可以认为是我们需要的结果。更改 cofficients 的值可以得到不同的结果 w。 +* 打印为 4.99999,基本可以认为是我们需要的结果。更改 cofficients 的值可以得到不同的结果 w。 -上述代码中: +* 上述代码中: ```py session = tf.Session() @@ -210,7 +209,7 @@ session.run(init) print(session.run(w)) ``` -也可以写作: +* 也可以写作: ```py with tf.Session() as session: @@ -218,6 +217,6 @@ with tf.Session() as session: print(session.run(w)) ``` -with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。 +* with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。 -想了解更多 Tensorflow 有关知识,请参考[官方文档](https://www.tensorflow.org)。 +* 想了解更多 Tensorflow 有关知识,请参考[官方文档](https://www.tensorflow.org)。