机器学习和人工智能系统的工程本质

  1. 利用机器学习开发人工智能系统的工程本质是在训练集构建成本和模型Performance之间找一个平衡点,并且保证模型效果在业务上可以接受。
  2. 当训练集的构建成本+模型训练成本之和大于模型在业务上的收益时,模型本身的构建就并无实际意义

神经网络基础

权值拟合的理论基础

当训练样例线性可分时,对于普通的感知器分类器,感知器法则可以找到一个合适的权向量,使得假设空间里有一个对应的完美决策面。

当训练样例不是线性可分时,基于梯度下降推导出的delta法则可以用来更新权值,以拟合最佳决策面,delta法则, (delta)wi = nita(t-o)xi. 这个公式其实也是Liner Regression和Logistic Regression的权值更新公式(在Liner Regression里叫LMS或Widrow-Hoff更新法则).

Delta法则在形式上包含了(t-o)这一个误差项,由此导出了节点误差项的概念,并沿用到多层神经网络的节点误差描述。

注意节点误差项和网络整体输出的误差项是两个不同的概念,并有不同的计算公式。

注意Delta法则是用来学习线性单元(而不是非线性单元)权值更新的方法。

神经网络的结构

经典的前馈神经网络是一个有向无环图, 并且还是一个篱笆图(Lattice Graph), 这种结构的特点是节点分层, 且同一层的节点相互不连接. 在这个网络中, 每一层节点的输出都是后一层节点的输入.

神经网络的节点由几种主要单元构成, 他们是感知器(perceptron), 线性单元(Liner unit)和非线性单元(Sigmoid Unit, Tanh Unit等). 最常见的神经网络节点由一个线性单元和一个非线性单元组成(线性加权求和然后Sigmoid计算输出)

梯度下降权值更新公式

权值增量 = 训练速率误差项权值所对应的输入;其中,误差项*权值 是该权值所对应的梯度分量。 误差函数的真实梯度包含了所有权值梯度作为分量。

Threhold Unit: Threhold unit is added to each layer of the network, including the input layer.
Threhold units added to the output layer is meaningless and will not affect network efficitiveness.

非线性隐藏层上Neural Network节点的个数和这个隐藏层接受输入信号的个数并没有关联

信息论和熵

随机变量的熵

熵常以数学符号H表示, 如果H(P)代表随机变量P的熵。

从概率论的角度上来说,熵描述了随机变量取值的不确定性。随机变量的熵的大小与其概率密度分布的均匀程度成正比,即均匀分布的随即变量每种取值几率相差不大,所以该分布描述的随即变量不确定性大,没有太多有效的信息。

对于随机变量X, 熵的定义为H=-SUM(Pi*log2(Pi))

 

交叉熵损失函数

交叉熵(Cross Entropy)描述了两个随机变量概率分布之间的差异

神经网络编程相关

  1. 输入向量输出向量的Numpy表示:x = np.array([0, 1, 2])
  2. 权值矩阵的Numpy表示:w = np.random.uniform(0, 1, (hidden_dim, input_dim)), 表示为一个M*N矩阵,其中M为隐层宽度(隐层节点数),N为隐层接收的输入向量长度。
  3.  隐层激活函数的输入:[hidden_dim, input_dim] * [input_dim, 1] , 表示为隐层的权值矩阵左乘输入向量

Numpy使用总结

  1. 在Numpy中,满足运算对象Shape要求的两个Numpy数组之间的四则运算会被转化为针对数组内每个元素的四则运算
  2.  行向量与列向量,行向量的表示: x = [x0, x1, x2], 列向量的表示: y = [[y0], [y1], [y2]], 列向量可以被看成是长度为1的行向量的组合。
  3.  逆转已有的Rank1 Array: np.arange(T)[::-1]

从零开始做产品-第二周

本周开发了用户接单的功能点,Web端基本可以用来做业务了,但由于三个原因没有将这个有业务功能(接单发单)的版本上线。第一,Web端完全没有做针对各类常见网站攻击行为的bug修复,所以Web端可以说是门户大开,上线了分分钟就要挂;第二,现在Web端的服务器物理节点在日本,从国内访问速度太慢;第三,网站上没有完整的支付功能,这是因为支付宝商家付款渠道需要网站域名在国内备案,而备案最好是以公司的名义进行,这又设计到公司的注册登记以及实体/虚拟办公地址的租赁,这部分工作着实有些成本。

国内公司必须有办公地址才能注册,在自己没有可供公司注册的商业地产的情况下,不论是租赁实体办公室还是在创业园区注册,均至少每个月要负担几百元的服务费,这是一笔每月都会发生的持续开销,我想慎重考虑。

在自媒体的运营和开发上,除了自己写一些内容外(面试别人和被面试的经验之类的),我主要想邀请熟人也利用业余时间贡献一点内容,不过在这一点上,虽然收到了一些热情的回应,但根据现在的情况恐怕并无法真正收到稿件。运营自媒体想来不比开发容易,依靠我现有的资源想获取免费的内容以常规手段是非常困难的,看来要另辟蹊径。

面试感想

HR面试官

在企业招聘面试流程里,HR面试一般是最后一个环节,涉及综合能力考查以及薪资期望等内容。某些企业HR面试分数在整个Offer发放决策中是有一定权重的,比如阿里巴巴。不同于技术面试官的随和与亲近,HR面试往往带有综合面试中所特有的甄别性。出于综合面试的体检特色,在HR面试中应聘者往往会被面试官打压以测试反应。

神经网络和深度学习

前言

距离我第一次学习并实践神经网络已经接近2年了,这2年里我在机器学习和自然语言处理这个领域有明显的进步,现在是时候系统性的总结和提高我的深度学习技能,并将之置于我今后个人实现AI系统的首选工具了。

普通的前向传播网络有两种训练方法:随即梯度下降和批量梯度下降。批量梯度下降通过累计训练样本的误差,反向传播回网络隐层节点来计算真实参数梯度,但缺点是容易受训练样本分布误差的影响而导致网络模型过拟合。随即梯度下降会利用每个训练样本依次计算参数梯度(根据这个样本的模型输出误差)并更新参数值,经验实验表明随即梯度下降能有效的缓解模型过拟合。

 

神经网络的有效性

依靠模型的表征能力,神经网络可以发挥训练数据的最大潜能,但是如果可采集的数据有限,那么神经网络的有效性随之受限。神经网络不能解决某一实践问题的原因一般有两个,第一是由于数据规模的限制导致训练集的构成这一样本分布不能有效逼近总体分布,第二是各种原因导致的模型过拟合。模型过拟合的问题一般与数据规模成反比,即大规模训练数据可以有效缓解过拟合问题。

模型有效性与数据规模的悖论

理论上讲,在真实环境上完美应用的模型需要有反映真实环境所有变量分布的训练集(即所有的可能真实数据),  但如果能够获取这些数据则失去了数学建模的必要性。(模型构建的目的是估计真实的变量分布,根据已知数据预测未知数据) 所以模型训练的最终目的是在训练集构建与模型有效性之间找到一个合理的平衡点,以合理的成本解决实际问题。

循环神经网络(RNN)

在传统的前向神经网络中,所有训练样本按照一定的顺序被依次作为网络输入送入输入层,这时每个训练样本由一个特征向量表示(Vector),这个特征向量的长度和网络的输入层的节点个数相对应。由于这一网络特性的约束,前向神经网络只能处理固定维数的特征输入。

在循环神经网络中(RNN), 每个训练样本同样由一个特征向量表示(Vector), 与前面不同的是,循环神经网络的输入特征向量是对训练样本离散时间维度的建模,每个维度代表在当前离散时间点上样本的特征值。为了拟合这种表征离散时间维度的特征向量,循环神经网络把隐层输出接入(同一或不同)隐层的输入,在隐层自身(或与其他隐层)之间形成闭环用以将参数更新与不同时间节点特征值之间的共现关系联系起来(在传统前向网络中特征向量中特征值之间的向后关系同样可以表征这种联系,只是由于网络自身的结构特性所以不适合此类任务)

在循环神经网络中,单个训练样本特征向量的所有维度(时间点)特征值被依次送入网络输入层,网络计算所有时间点的输出并累计误差值。

Programming Language Features

  1. JVM memory allocation doesn't happen until new keyword object creation or variable initialization is performed. The memory of primitive type variables are allocated on stack while others are allocated on heap.

The declaration of array variables does not require array size to be specified, which is different to C++ array declaration.