Batch size and epochs 参数设置

Batch的含义:

引用自:http://keras-cn.readthedocs.io/en/latest/for_beginners/concepts/

深度学习的优化算法,说白了就是梯度下降。每次的参数更新有两种方式。

第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度。这种方法每更新一次参数都要把数据集里的所有样本都看一遍,计算量开销大,计算速度慢,不支持在线学习,这称为Batch gradient descent,批梯度下降。

另一种,每看一个数据就算一下损失函数,然后求梯度更新参数,这个称为随机梯度下降,stochastic gradient descent。这个方法速度比较快,但是收敛性能不太好,可能在最优点附近晃来晃去,hit不到最优点。两次参数的更新也有可能互相抵消掉,造成目标函数震荡的比较剧烈。

为了克服两种方法的缺点,现在一般采用的是一种折中手段,mini-batch gradient decent,小批的梯度下降,这种方法把数据分为若干个批,按批来更新参数,这样,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性。另一方面因为批的样本数与整个数据集相比小了很多,计算量也不是很大。

基本上现在的梯度下降都是基于mini-batch的,所以Keras的模块中经常会出现batch_size,就是指这个。

顺便说一句,Keras中用的优化器SGD是stochastic gradient descent的缩写,但不代表是一个样本就更新一回,还是基于mini-batch的。

epochs的含义:

指的是训练过程中,训练数据将被跑几轮。

Keras中,batch_size 和 epochs参数值的影响:

(以下内容,参考自知乎:https://www.zhihu.com/question/32673260)

在训练时, 需要指定最小批次:batch_size, 以及迭代次数:epochs。 这两个参数可以显著的影响训练收敛的速度及准确度。设置不当的话,很可能会导致训练不收敛,或者要训练很久才会收敛。

分别说明:

batch_size: 

batch_size比较大的情况下,训练容易陷入局部最优解(local minimize)的情况,同时对机器内存(以及显存)的配置要求比较高。好处是收敛速度比较快(存疑)。
batch_size比较小的情况下,收敛的速度会慢一些, 甚至有可能会不收敛。 但是训练引入的随机性比较大,相当程度上可避免出现局部最优解(local minimize), 对硬件配置要求相对较低。

batch数太小,而类别又比较多的时候,真的可能会导致loss函数震荡而不收敛,尤其是在你的网络比较复杂的时候。

那么怎么选择batch size呢?可以选择8的倍数,然后是稍微大一点(一般而言)。另外一个方法,就是选择一部分数据,跑几个batch看看loss是不是在变小, 选择一个合适的就可以了。

keras batch_size和np_epoch参数理解

batch_size: 最小批次(mini-batch)包含测试数据的个数

np_epoch: 总共要执行几个最小批次.

训练的总次数=batch_size * np_epoch

性能调试, 两种参数方案:

batch size = 1, 50000 updates in on epoch

batch size = 10, 5000 updates in on epoch ( 这一组调试的梯度递减数据会比较稳定)

如果batch_size太大, 硬件会成为计算的瓶颈. 此外, batch_size太大还会导致很容易在梯度递减的过程中, 遇到 local minimalize, 因epoch的次数很小, 就会造成很快就结束学习过程.

用GPU配置 mini batch, 就可以达到计算加速的效果. 如果mini batch设为1, 则无法产生加速效果.

【笔记】机器学习——参考资料

一过日本留学在校生对于人工智能行业整体情况的介绍及学习资料的整理:
http://blog.csdn.net/sileixinhua/article/details/75203725

深度学习大神都推荐入门必须读完这9篇论文:
http://blog.csdn.net/meyh0x5vDTk48P2/article/details/79072666

机器学习的定义, 分类, 应用领域, 现状问题:
http://blog.csdn.net/Tw6cy6uKyDea86Z/article/details/79016233

人工神经网格(Artificial Neural Network)概貌, 吴军, 数学之美, 倒数第二章.

“机器学习速成课程”中文版:
https://developers.google.com/machine-learning/crash-course/

Learn with Google AI:
https://ai.google/education


AI玩微信跳一跳的正确姿势 –跳一跳Auto-Jump算法详解:
https://zhuanlan.zhihu.com/p/32636329
https://github.com/Prinsphield/Wechat_AutoJump

 

 

TensorFlow 中文社区 MNIST学习笔记

本笔记内容整理自: http://www.tensorfly.cn/tfdoc/tutorials/mnist_beginners.html

官方例子: 辨识手写数字

要实现的功能: 从MNIST数据集中训练, 学习, 实现识别手写数字的功能.

模型思路:

每一张图片包含(28像素*28像素)。我们可以用一个数字数组来表示这张图片:

我们把这个数组展开成一个向量,长度是 28×28 = 784。

于是, 对于给定的一张图片, 可以通过矩阵将图片表示为: [x1, x2, … , x784].

通过神经网络, 将分别对这个矩阵数据进行加权运行, 加上一定的偏移量(bias), 计算出对应0-9的每个数字的概率是多少, 概率最大的那个就是神经经网络判断的结果.

所有步骤可以简化为:

1.

对[x1, x2, ..., x784]通过加权矩阵[W1,1, W1,2, ..., W1,784]计算, 加上偏移b1, 得到X这张图片数字为0的概率;

2.

对[x1, x2, ..., x784]通过加权矩阵[W2,1, W2,2, ..., W2,784]计算, 加上偏移b2, 得到X这张图片数字为1的概率;

3.

 ...... (分别计算为2,3,4,5,6,7,8的概率); 

4.

对[x1, x2, ..., x784]通过加权矩阵[W10,1, W10,2, ..., W10,784]计算, 加上偏移b9, 得到X这张图片数字为9的概率;

5.

得出概率最大的那个即为神经网络运算的结果, 同时如果概率要尽可能接近100%, 则表示结果可信度更好.

这里, 加权矩阵W[784,10], 以及偏移量矩阵b[1,10], 就是我们通过深度学习要挖掘出来的数据, 是我们所有训练, 测试所要达到的目标.

对于softmax回归模型可以用下面的图解释,对于输入的xs加权求和,再分别加上一个偏置量,最后再输入到softmax函数中:

 

其实就是:

y1=softmax(W1,1 * X1 +W1,2 * X2 +W1,3 * X3 + b1)

y2=softmax(W2,1 * X1 +W2,2 * X2 +W2,3 * X3 + b2)

y3=softmax(W3,1 * X1 +W3,2 * X2 +W3,3 * X3 + b3)

我们可以用向量表示这个计算过程:用矩阵乘法和向量相加。这有助于提高计算效率。(也是一种更有效的思考方式)

更进一步,可以写成更加紧凑的方式:

softmax函数的作用: 把Wx+b的输出空间映射到[0, 1]这个区间, 映射得到的值相当于统计意义上的概率, 不同输出值的大小相当于概率的大小.

 

深度学习相关概念解读

1.过拟合(overfitting):

指一个假设能够很好的拟合训练数据, 却无法在训练数据以外的情况下达到相同的拟合效果. 一般是训练数据太少, 或者是训练数据中存在噪音.

2. 单调函数:

函数在指定的定义域内单调递增或递减.

3.Softmax回归函数:

将神经网络的输出映射到[0,1]这个区间上, 所有输出的累和是1, 满足概率的性质. 我们可以将每个输出映射后得到的值都理解成概率, 在最后对比所有输出节点数据的时候, 就可以选取概率最大的节点作为我们的预测目标.

(图片引用自李宏毅ppt)

4. 学习速度(learning rate):

有的地方翻译为学习率,但还是觉得翻译为学习速度更为直接, 它表示参数到达最优值过程的速度快慢。在神经网络的训练阶段,调整梯度下降算法的学习率可以改变网络权重参数的更新幅度。

形象的例子: 假如你从山峰的最高点根据梯度下降法寻找最优值,当你学习率过大,即下降的快,步子大,那么你很可能会在某一步跨过最优值; 当你学习率过小时,每次下降一厘米,这将走到何年何月呀,用术语来说就是,长时间无法收敛。因此,学习率直接决定着学习算法的性能表现。

一般常用的学习率有0.00001,0.0001,0.001,0.003,0.01,0.03,0.1,0.3,1,3,10.

5.交叉熵(cross entropy)

定义及原理:

(主要参考了知乎: https://www.zhihu.com/question/41252833 )

交叉熵的公式为: \sum_{k=1}^N p_k \log_2 \frac{1}{q_k} ,其中 p_k 表示真实分布, q_k 表示非真实分布

交叉熵,其用来衡量在给定的真实分布下,使用非真实分布所指定的策略消除系统的不确定性所需要付出的努力的大小. 

什么叫真实分布, 什么叫非真实分布?

举例说明如下:

假设一个盒子里面放了800个球, 球的颜色有4种, 颜色种类及数量占比分别为: 橙(1/2),紫(1/4),蓝(1/8), 青(1/8). 表示为 p=(1/2, 1/4, 1/8, 1/8).

这里, 橙(1/2),紫(1/4),蓝(1/8), 青(1/8)就是真实的概率分布.

我们随机从例子4拿出一个球, 让不知道真实概率分布的人来猜球的颜色.

如果这个人用 1/4, 1/4, 1/4, 1/4的概率分布来猜测颜色, 那他猜颜色时所使用的就是非真实分布.表示为 q=(1/4, 1/4, 1/4, 1/4).

交叉熵就是用来衡量在给定真实分布的条件下, 使用非真实分布作为策略消除系统不确定性所需成本的大小.

在交叉熵越小, 策略就越好, 最低的交叉熵也就是使用了真实分布的计算出来的信息熵, 此时 q = p, 交叉熵=信息熵.

在机器学习中的分类算法中, 我们总是最小化交叉熵,因为交叉熵越低, 就证明算法所产生的策略最接近最优策略, 也间接证明我们算法所算出的非真实分布越接近真实分布.

可参考: 吴军 数学之美.
为什么要使用交叉熵?
如下图所示, 一个是通过平方差来描述损失函数, 另一个是通过交叉熵来描述损失函数. 在距离min(Total Loss)比较远的地方, 通过观察斜率, 可以看到平方差的模型在微分后斜率接近于0, 而交叉熵在微分后斜率是比较大的.

因为在min(Total Loss)这个点附近的斜率也是接近于0, 当模型的数据训练到该点附近时, learning rate的值都会设为比较小, 以保证学习的精度, 但这也意味着学习的速度比较慢. 使用平方差来描述损失函数的话, 在距离min(Total Loss)这个点比较远就会出现斜率接近于0的情况, 这将导致整个学习速度变得很慢. 

相反, 交叉熵来描述的损失函数就允许学习速度在离min(Total Loss)这个点比较远的时候, 斜率比较大, 此时learning rate可以取比较大的值. 当斜率比较小时, 意味着离min(Total Loss)这个点比较近, 此时learning rate可以取比较小的值.Learning rate的取值是一个由大至小的变化过程, 可以有效的保证学习的速度及精度.


6. 对数 (取自百度百科)

对数的定义
如果   ,即ax次方等于Na>0,且a≠1),那么数x叫做以a为底N的对数(logarithm),记作  。其中,a叫做对数的

底数

N叫做

真数

x叫做“以a为底N对数”。

1.特别地,我们称以10为底的对数叫做

常用对数

(common logarithm),并记为lg。

称以无理数e(e=2.71828...)为底的对数称为

自然对数

(natural logarithm),并记为ln。

2.零没有对数。

3.在

实数

范围内,负数无对数。在

复数

范围内,负数是有对数的。
对数函数
定义

函数   叫做

对数函数

(logarithmic function),其中x

自变量

。对数函数的定义域是  。

函数基本性质

1、过定点  ,即x=1时,y=0。

2、当  时,在  上是

减函数

;

当  时,在  上是

增函数

 

对数函数

CNN RNN DNN

CNN: 一文读懂卷积神经网络 http://www.36dsj.com/archives/24006
TO BE UPDATE...

. 卷积:

参考自知乎: https://www.zhihu.com/question/22298352

卷积, 与其理解成翻转, 不如理解成延迟后叠加。

假设小明以每年追回定期存款100元, 利息0.05每年
我们将以计算5年后本息总共有多少为例来理解卷积.

第一笔本金, 在每年的累积得到的利息如下所示:

 
每年都存100元, 5年下来, 获利明细如下:

在第5年, 总共可以取得本金加利息的金额如下:

用求和符号来简化这个公式,可以得到:
\sum_{i=0}^{5}{f(i)g(5-i)}, \mathrm{where} \ f(i)=100, g(5-i) = (1.05)^{5-i}
在上式中,f(i)为小明的存钱函数,而g(i)为存入银行的每一笔钱的复利计算函数。在这里,小明最终得到的钱就是他的存钱函数和复利计算函数的卷积。

如果把这个公式从离散推广到连续的情况, 小明从在[0,t]这段时间内持续的存钱, 他的存钱函数就为:f(\tau)\ (0\leq \tau\leq t), 那么在t这个时间点, 单笔存款按复利公式计算得到的收益为:g(t-\tau)=(1+5\%)^{t-\tau}, 则小明到时间t将得到的总钱数为:
\int_{0}^{t} f(\tau)g(t-\tau)d\tau=\int_{0}^{t} f(\tau)(1+5\%)^{t-\tau}d\tau
这也就是卷积的表达式了,上式可以记为(f\ast g)(t)
如果我们将小明的存款函数视为一个信号发生(也就是激励)的过程,而将复利函数g(t-\tau)视为一个系统对信号的响应函数(也就是响应,那么二者的卷积(f\ast g)(t)就可以看做是在t时刻对系统进行观察,得到的观察结果(也就是输出)将是过去产生的所有信号经过系统的「处理/响应」后得到的结果的叠加,这也就是卷积的物理意义了。


.梯度消失

7. 回归

简单理解:
举例来讲,假设我们知道二维平面一系列离散的点 (xi, yi)(i=1,2,...,n)
并且这些点有一个准确的函数:y=f(x)来表示, 我们还不知道这个函数。但我们可以通过统计学上的方法,不断地寻找一个函数,来无限接近于f(x)所表示的关系。这个过程,可以理解为回归。

比较学术的解释:
回归分析是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。所谓回归分析就是分析两个变量在平均意义下的函数关系表达式,回归函数。

它的实际意义就是对于两个具有相关关系但不能给出二者确切函数关系的变量,可以在平均意义下给出两者的近似关系。而分析这两个具有相关关系的变量在平均意义下的函数关系表达式,就是回归函数。

确定两种或者两种以上变量间相互依赖的定量关系的统计分析方法就是回归分析,回归分析主要分为一元回归,多元回归以及线性回归和非线性回归。
也就是说,两个具有相关关系(非确定性关系)的变量,我们通过实际数据绘制散点图,模拟它的趋势,选择合适的回归函数确定这两个变量的可能性关系。