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

一过日本留学在校生对于人工智能行业整体情况的介绍及学习资料的整理:
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

 

 

MAC下安装TensorFlow

内容直接参考了官网: https://www.tensorflow.org/install/

方法1: 下载编译好的包直接安装

pip install https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl

验证:

$ python

>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print sess.run(hello)
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print sess.run(a+b)
42
>>>

方法2: 通过Anaconda进行安装

1.先下载并安装Anaconda, 中国大陆可以从: https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 下载, 速度很快. 注意选择对应版本, 安装包里的数字对应的就是python的版本号.

2.创建一个 conda 中名字为 tensorflow的运行环境:
$ conda create -n tensorflow pip python=2.7 # or python=3.3, etc.

3.激活conda的tensorflow环境:
$ source activate tensorflow
 (targetDirectory)$ # Your prompt should change
 (逆向操作:source deactivate)

4.使用下列命令在conda里的tensorflow环境中安装tensorflow:
(targetDirectory)$ pip install --ignore-installed --upgrade TF_PYTHON_URL
where TF_PYTHON_URL is the URL of the TensorFlow Python package.

例如, 下述命令将安装一个python 3, 只支持CPU运算的tensorflow版本:(targetDirectory)$ pip install --ignore-installed --upgrade \
https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.5.0-py3-none-any.whl

5.验证安装结果:
执行一个tensorflow小程序验证.

6.在conda tenforflow环境下额外安装pandas:
(targetDirectory)$ # pip install pandas

方法3: 下载源码到本地根据本地环境编译安装

环境准备:

Mac OS X 下环境搭建: 
1.从 app store 安装 xcode 
2.安装 Homebrew /usr/bin/ruby -e "$(curl -fsSL \  https://raw.githubusercontent.com/Homebrew/install/master/install)" 
3. 安装Bazel (Google开源的软件构建工具) brew install bazel 验证: bazel version 更新版本: brew upgrade bazel 
4. 安装SWIG 
brew install swig 注意: 你需要安装PCRE, 而不是 PCRE2. 
5. 安装Numpy,six,wheel
sudo pip install numpy six wheel

tenforflow的GPU计算只支持NVIDIA的显卡, 故MAC的机器不用考虑该部分内容.
(MAC)编译过程:

2.1 克隆TensorFlow仓库到本地

$ git clone --recurse-submodules https://github.com/tensorflow/tensorflow 

2.2 进入源码目录
$ cd tensorflow 

2.3 生成环境配置
$ ./configure
  (中文网站没有说到这一步, 但如果不执行的话, 会报找不到numpy)

2.4 编译并安装:

$ bazel build -c opt //tensorflow/tools/pip_package:build_pip_package

2.5 创建 pip 包
$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

2.6 安装pip包
# .whl 文件的实际名字与你所使用的平台有关
$ pip install /tmp/tensorflow_pkg/tensorflow-0.5.0-cp27-none-linux_x86_64.whl

安装遇到的问题:

1. 从源码编译安装, 执行:

bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

命令成功完成, 在执行命令的这个shell窗口, 可以以python里import tensorflow, 但是在其它的shell窗口, import tensorflow提示:

$ python

Python 2.7.13 (default, Mar 19 2017, 21:40:17) 

[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> import tensorflow as tf

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

ImportError: No module named tensorflow

观察发现, 能成功import tensorflow的窗口打印的python版本信息为:

$ python
Python 2.7.13 (default, Apr 1 2017, 13:31:12) 
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>>

也就是说虽然看上去python版本都是2.7.13, 其实执行的环境并不一样.

pyenv打印出来的信息对比:

成功的shell窗口:

$ pyenv versions

  system

  2.7.10

* 2.7.13 (set by /Users/xxx/.pyenv/version)

失败的shell窗口: 

$ pyenv versions

* system (set by /Users/xxx/.python-version)

  2.7.10

  2.7.13

查看pyenv help, 发现通过pyenv local 来指定环境信息:

$ pyenv help local

Usage: pyenv local <version>

       pyenv local --unset

Sets the local application-specific Python version by writing the

version name to a file named `.python-version'.

When you run a Python command, pyenv will look for a `.python-version'

file in the current directory and each parent directory. If no such

file is found in the tree, pyenv will use the global Python version

specified with `pyenv global'. A version specified with the

`PYENV_VERSION' environment variable takes precedence over local

and global versions.

<version> should be a string matching a Python version known to pyenv.

The special version string `system' will use your default system Python.

Run `pyenv versions' for a list of available Python versions.

根据帮助内容, 简单粗暴地执行了如下命令:

$ export PYENV_VERSION=2.7.13

强制设置一个环境变量, 让python执行时使用: 

2.7.13 (set by /Users/xxx/.pyenv/version)

接下来再执行import tensorflow就正常了

$ pyenv versions

  system

  2.7.10

* 2.7.13 (set by PYENV_VERSION environment variable)

$ python

Python 2.7.13 (default, Apr  1 2017, 13:31:12) 

[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.38)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> import tensorflow as tf

>>> 

 

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]这个区间, 映射得到的值相当于统计意义上的概率, 不同输出值的大小相当于概率的大小.

 

《秦时明月》对话节选

你们以为清除所有不利因素,大秦就能永远稳定下去?
那,以大师之见呢?
山中樱树,虽有花开烂漫之时,然而终归尘土,人的生命不过如此,国之大业,亦不过如此。
樱花的花期不过短短数日,人的生命却有数十载,帝国的霸业更是万世基业,如何能相提并论?
你的眼界,实在太过狭隘。
有一种菌草,日出而生,日落而死,终其一生,不知黎明与黑夜;寒蝉春天生而夏天死,一生不知还有秋天和冬天;相传有一种神木叫做大椿,将八千年当作一个春季,八千年当作一个秋季,殊不知在天地之间,也不过是弹指一瞬,片刻光阴。人生在世,如白驹过隙,国家存于天地,亦不过光年流转,昙花一现。
朝闻道,夕死可矣。章邯浅见,国家与自身皆是如许。
孔子的这句话,引得无数人飞蛾扑火,遗祸不浅。
大师高见,章邯受教了。
你的消息,我已经收到了。
大师的意思是。。。?
师尊的意思是,你可以走了~

——这段对话引用自:《秦时明月》

典故出自《庄子·逍遥游》:朝菌不知晦朔,蟪蛄不知春秋

一文读懂卷积神经网络

该篇文章, 转载自: http://blog.csdn.net/stdcoutzyx/article/details/41596663

卷积神经网络

自今年七月份以来,一直在实验室负责卷积神经网络(Convolutional Neural Network,CNN),期间配置和使用过theano和cuda-convnet、cuda-convnet2。为了增进CNN的理解和使用,特写此博文,以其与人交流,互有增益。正文之前,先说几点自己对于CNN的感触。先明确一点就是,Deep Learning是全部深度学习算法的总称,CNN是深度学习算法在图像处理领域的一个应用。

  • 第一点,在学习Deep learning和CNN之前,总以为它们是很了不得的知识,总以为它们能解决很多问题,学习了之后,才知道它们不过与其他机器学习算法如svm等相似,仍然可以把它当做一个分类器,仍然可以像使用一个黑盒子那样使用它。
  • 第二点,Deep Learning强大的地方就是可以利用网络中间某一层的输出当做是数据的另一种表达,从而可以将其认为是经过网络学习到的特征。基于该特征,可以进行进一步的相似度比较等。
  • 第三点,Deep Learning算法能够有效的关键其实是大规模的数据,这一点原因在于每个DL都有众多的参数,少量数据无法将参数训练充分。

接下来话不多说,直接奔入主题开始CNN之旅。

1. 神经网络

首先介绍神经网络,这一步的详细可以参考资源1。简要介绍下。神经网络的每个单元如下:

logistic

其对应的公式如下:

equal

其中,该单元也可以被称作是Logistic回归模型。当将多个单元组合起来并具有分层结构时,就形成了神经网络模型。下图展示了一个具有一个隐含层的神经网络。

equal

其对应的公式如下:

equal

比较类似的,可以拓展到有2,3,4,5,…个隐含层。

神经网络的训练方法也同Logistic类似,不过由于其多层性,还需要利用链式求导法则对隐含层的节点进行求导,即梯度下降+链式求导法则,专业名称为反向传播。关于训练算法,本文暂不涉及。

2 卷积神经网络

在图像处理中,往往把图像表示为像素的向量,比如一个1000×1000的图像,可以表示为一个1000000的向量。在上一节中提到的神经网络中,如果隐含层数目与输入层一样,即也是1000000时,那么输入层到隐含层的参数数据为1000000×1000000=10^12,这样就太多了,基本没法训练。所以图像处理要想练成神经网络大法,必先减少参数加快速度。就跟辟邪剑谱似的,普通人练得很挫,一旦自宫后内力变强剑法变快,就变的很牛了。

2.1 局部感知

卷积神经网络有两种神器可以降低参数数目,第一种神器叫做局部感知野。一般认为人对外界的认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。网络部分连通的思想,也是受启发于生物学里面的视觉系统结构。视觉皮层的神经元就是局部接受信息的(即这些神经元只响应某些特定区域的刺激)。如下图所示:左图为全连接,右图为局部连接。

equal

在上右图中,假如每个神经元只和10×10个像素值相连,那么权值数据为1000000×100个参数,减少为原来的万分之一。而那10×10个像素值对应的10×10个参数,其实就相当于卷积操作。

2.2 参数共享

但其实这样的话参数仍然过多,那么就启动第二级神器,即权值共享。在上面的局部连接中,每个神经元都对应100个参数,一共1000000个神经元,如果这1000000个神经元的100个参数都是相等的,那么参数数目就变为100了。

怎么理解权值共享呢?我们可以这100个参数(也就是卷积操作)看成是提取特征的方式,该方式与位置无关。这其中隐含的原理则是:图像的一部分的统计特性与其他部分是一样的。这也意味着我们在这一部分学习的特征也能用在另一部分上,所以对于这个图像上的所有位置,我们都能使用同样的学习特征。

更直观一些,当从一个大尺寸图像中随机选取一小块,比如说 8×8 作为样本,并且从这个小块样本中学习到了一些特征,这时我们可以把从这个 8×8 样本中学习到的特征作为探测器,应用到这个图像的任意地方中去。特别是,我们可以用从 8×8 样本中所学习到的特征跟原本的大尺寸图像作卷积,从而对这个大尺寸图像上的任一位置获得一个不同特征的激活值。

如下图所示,展示了一个3×3的卷积核在5×5的图像上做卷积的过程。每个卷积都是一种特征提取方式,就像一个筛子,将图像中符合条件(激活值越大越符合条件)的部分筛选出来。

equal

2.3 多卷积核

上面所述只有100个参数时,表明只有1个10*10的卷积核,显然,特征提取是不充分的,我们可以添加多个卷积核,比如32个卷积核,可以学习32种特征。在有多个卷积核时,如下图所示:

equal

上图右,不同颜色表明不同的卷积核。每个卷积核都会将图像生成为另一幅图像。比如两个卷积核就可以将生成两幅图像,这两幅图像可以看做是一张图像的不同的通道。如下图所示,下图有个小错误,即将w1改为w0,w2改为w1即可。下文中仍以w1和w2称呼它们。

下图展示了在四个通道上的卷积操作,有两个卷积核,生成两个通道。其中需要注意的是,四个通道上每个通道对应一个卷积核,先将w2忽略,只看w1,那么在w1的某位置(i,j)处的值,是由四个通道上(i,j)处的卷积结果相加然后再取激活函数值得到的。

equal

equal

所以,在上图由4个通道卷积得到2个通道的过程中,参数的数目为4×2×2×2个,其中4表示4个通道,第一个2表示生成2个通道,最后的2×2表示卷积核大小。

2.4 Down-pooling

在通过卷积获得了特征 (features) 之后,下一步我们希望利用这些特征去做分类。理论上讲,人们可以用所有提取得到的特征去训练分类器,例如 softmax 分类器,但这样做面临计算量的挑战。例如:对于一个 96X96 像素的图像,假设我们已经学习得到了400个定义在8X8输入上的特征,每一个特征和图像卷积都会得到一个 (96 − 8 + 1) × (96 − 8 + 1) = 7921 维的卷积特征,由于有 400 个特征,所以每个样例 (example) 都会得到一个 7921 × 400 = 3,168,400 维的卷积特征向量。学习一个拥有超过 3 百万特征输入的分类器十分不便,并且容易出现过拟合 (over-fitting)。

为了解决这个问题,首先回忆一下,我们之所以决定使用卷积后的特征是因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)。这些概要统计特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling),有时也称为平均池化或者最大池化 (取决于计算池化的方法)。

equal

至此,卷积神经网络的基本结构和原理已经阐述完毕。

2.5 多层卷积

在实际应用中,往往使用多层卷积,然后再使用全连接层进行训练,多层卷积的目的是一层卷积学到的特征往往是局部的,层数越高,学到的特征就越全局化。

3 ImageNet-2010网络结构

ImageNet LSVRC是一个图片分类的比赛,其训练集包括127W+张图片,验证集有5W张图片,测试集有15W张图片。本文截取2010年Alex Krizhevsky的CNN结构进行说明,该结构在2010年取得冠军,top-5错误率为15.3%。值得一提的是,在今年的ImageNet LSVRC比赛中,取得冠军的GoogNet已经达到了top-5错误率6.67%。可见,深度学习的提升空间还很巨大。

下图即为Alex的CNN结构图。需要注意的是,该模型采用了2-GPU并行结构,即第1、2、4、5卷积层都是将模型参数分为2部分进行训练的。在这里,更进一步,并行结构分为数据并行与模型并行。数据并行是指在不同的GPU上,模型结构相同,但将训练数据进行切分,分别训练得到不同的模型,然后再将模型进行融合。而模型并行则是,将若干层的模型参数进行切分,不同的GPU上使用相同的数据进行训练,得到的结果直接连接作为下一层的输入。

equal

上图模型的基本参数为:
  • 输入:224×224大小的图片,3通道
  • 第一层卷积:11×11大小的卷积核96个,每个GPU上48个。
  • 第一层max-pooling:2×2的核。
  • 第二层卷积:5×5卷积核256个,每个GPU上128个。
  • 第二层max-pooling:2×2的核。
  • 第三层卷积:与上一层是全连接,3*3的卷积核384个。分到两个GPU上个192个。
  • 第四层卷积:3×3的卷积核384个,两个GPU各192个。该层与上一层连接没有经过pooling层。
  • 第五层卷积:3×3的卷积核256个,两个GPU上个128个。
  • 第五层max-pooling:2×2的核。
  • 第一层全连接:4096维,将第五层max-pooling的输出连接成为一个一维向量,作为该层的输入。
  • 第二层全连接:4096维
  • Softmax层:输出为1000,输出的每一维都是图片属于该类别的概率。

4 DeepID网络结构

DeepID网络结构是香港中文大学的Sun Yi开发出来用来学习人脸特征的卷积神经网络。每张输入的人脸被表示为160维的向量,学习到的向量经过其他模型进行分类,在人脸验证试验上得到了97.45%的正确率,更进一步的,原作者改进了CNN,又得到了99.15%的正确率。

如下图所示,该结构与ImageNet的具体参数类似,所以只解释一下不同的部分吧。

equal

上图中的结构,在最后只有一层全连接层,然后就是softmax层了。论文中就是以该全连接层作为图像的表示。在全连接层,以第四层卷积和第三层max-pooling的输出作为全连接层的输入,这样可以学习到局部的和全局的特征。

5 参考资源

  • [1] http://deeplearning.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B 栀子花对Stanford深度学习研究团队的深度学习教程的翻译
  • [2] http://blog.csdn.net/zouxy09/article/details/14222605 csdn博主zouxy09深度学习教程系列
  • [3] http://deeplearning.net/tutorial/ theano实现deep learning
  • [4] Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]//Advances in neural information processing systems. 2012: 1097-1105.
  • [5] Sun Y, Wang X, Tang X. Deep learning face representation from predicting 10,000 classes[C]//Computer Vision and Pattern Recognition (CVPR), 2014 IEEE Conference on. IEEE, 2014: 1891-1898.

深度学习相关概念解读

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)所表示的关系。这个过程,可以理解为回归。

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

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

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

 

 

 

 

 

关于激活函数的理解

本篇内容主要都是参考知乎: https://www.zhihu.com/question/22334626 加上个人理解整理而成, 很多图片直接引用自该帖.

深度学习要处理的数据, 其实基本上是无法通过类似: y = w1*x2+w2*x2+b 这样的线性表达式直接表达出来, 所以需要通过通过激活函数, 间接地达到线性表达式的结果, 直观的表示计算结果为”true” or “false”.

一万个线性函数的复合函数还是线性函数,那还要“深度”学习做什么? 激活函数就是为了增加神经网络对“非线性”数据的表达能力.

Part 1:

某些数据是线性可分的,意思是,可以用一条直线将数据分开。比如下图:

但是有些数据不是线性可分的。比如如下数据:

第二组数据你就没有办法画出一条直线来将数据区分开。

这时候有两个办法,第一个办法,是做线性变换(linear transformation),比如将x,y变成x^2,y^2,这样可以画出圆形。如图所示:

如果将坐标轴从x,y变为以x^2,y^2为标准,你会发现数据经过变换后是线性可分的了。大致示意图如下:

总的来说, 就是将非线性的数据, 拟合成线性的方式来表达.

(原作者描述的: 引入非线性函数, 异或问题的那一段尚未理解, 在此处不引用)

Part 2:

另外一种通俗的理解如下.

首先我们有这个需求,就是二分类问题,如我要将下面的三角形和圆形点进行正确的分类,如下图:

利用我们单层的感知机, 用它可以划出一条线, 把平面分割开:

上图右侧直线可以写成线性表达式: w_{1}x_{1} + w_{2}x_{2}+b=0 . 在直线右侧的为正类, 在直线左侧的为负类.

但是如果出现如下图的情况, 要通过线性函数直接区分开圆形跟三角形的集合, 就无法实现:

很容易能够看出,我给出的样本点根本不是线性可分的,一个感知器无论得到的直线怎么动,都不可能完全正确的将三角形与圆形区分出来.

那如果用多个感知器呢? 比如3个:

我们能够得到

y=w_{2-1}(w_{1-11}x_{1}+ w_{1-21}x_{2}+b_{1-1} )+ w_{2-2}(w_{1-12}x_{1}+ w_{1-22}x_{2}+b_{1-2} )+w_{2-3}(w_{1-13}x_{1}+ w_{1-23}x_{2}+b_{1-3} )

将多项式变换下组合, 我们可以得到:

y=x_{1}(w_{2-1}w_{1-11}+w_{2-2}w_{1-12} +w_{2-3}w_{1-13} )+x_{2} (w_{2-1}w_{1-21}+w_{2-2}w_{1-22} +w_{2-3}w_{1-23} )+w_{2-1} b_{1-1} +w_{2-2} b_{1-2}+w_{2-3} b_{1-3}

其实这本质上还是一个线性表达式, 无法表达非线性问题.

深度学习肯定不只是能处理线性问题, 更重要的是能处理非线性问题.

在上面线性方程的组合过程中,我们其实类似在做三条直线的组合,如下图:

这个时候可以开始引入激活函数了, 这里就给出sigmoid例子,如下图:

通过这个激活函数映射之后,输出很明显就是一个非线性函数!能不能解决一开始的非线性分类问题不清楚,但是至少说明有可能啊,上面不加入激活函数神经网络压根就不可能解决这个问题~

当扩展到多个神经元组合的情况时候,表达能力就会更强~对应的组合图如下:(现在已经升级为三个非线性感知器在组合了)

跟上面线性组合相对应的非线性组合如下:

这看起来厉害多了,是不是~最后再通过最优化损失函数的做法,我们能够学习到不断学习靠近能够正确分类三角形和圆形点的曲线,到底会学到什么曲线,不知道到底具体的样子,也许是下面这个~

那么随着不断训练优化,我们也就能够解决非线性的问题了

所以到这里为止,我们就解释了这个观点: 加入激活函数是用来加入非线性因素的,解决线性模型所不能解决的问题。