机器学习概览
1.1 机器学习定义
- 机器学习:从数据或经验中学习。
- 学习的方面:
- 学习参数(例如概率)
- 学习结构(例如贝叶斯网络)
- 学习隐藏概念(例如聚类)
1.2 机器学习示例
1.2.1 垃圾邮件过滤器
- 输入:一封电子邮件
- 输出:垃圾邮件(spam)或正常邮件(ham)
- 设置:
- 收集大量已标记的邮件样本(需要人工标记)。
- 目标是预测新邮件的标签。
- 特征 (Features):用于决策的属性,例如:
- 关键词:如 "FREE!"
- 文本模式:如 "$dd", "CAPS" (大写字母)
- 非文本信息:如发件人是否在联系人列表 (SenderInContacts)
1.2.2 数字识别
- 输入:图像/像素网格
- 输出:一个数字 0-9
- 设置:
- 收集大量已标记的图像样本(需要人工标记)。
- 目标是预测新数字图像的标签。

- 特征 (Features):用于决策的属性,例如:
- 像素:如
- 形状模式:如组件数量 (NumComponents)、宽高比 (AspectRatio)、闭环数量 (NumLoops)
分类方法
2.1 基于模型的分类
- 思路:
- 建立一个模型(如贝叶斯网络),其中标签和特征都是随机变量。
- 实例化观察到的特征。
- 查询以特征为条件的标签分布。
- 挑战:
- 贝叶斯网络应该具有什么结构?
- 如何学习其参数?
- 示例:垃圾邮件过滤模型
- 模型公式:
- 参数包括:
- (例如, ham: 0.66, spam: 0.33)
- (词语在正常邮件中的概率)
- (词语在垃圾邮件中的概率)
- 这些概率表通常从已标记数据中统计得到。

2.2 重要概念
- 数据 (Data):已标记的实例,如标记为 spam/ham 的邮件。
- 训练集 (Training set)
- 留出集/验证集 (Held out set/ validation set)
- 测试集 (Test set)

- 特征 (Features):描述每个实例x的属性-值对。
- 实验周期 (Experimentation cycle):
- 在训练集上学习参数(如模型概率)。
- (在留出集上调整超参数)。
- 计算在测试集上的准确率。
- 非常重要:绝不能“偷看”测试集!
- 评估 (Evaluation):
- 准确率 (Accuracy):被正确预测的实例的比例。
- 过拟合 (Overfitting) 和泛化 (Generalization):
- 目标是得到一个在训练、测试数据上表现良好的分类器。
- 过拟合:非常紧密地拟合训练数据,但在未见过的数据上泛化能力差。
- 模型复杂度越高,越容易过拟合
2.3 基准 (Baselines)
- 第一步:获得一个基准。
- 基准是非常简单的“稻草人”程序。
- 作用:
- 帮助确定任务的难度。
- 帮助了解什么是“好”的准确率。
- 弱基准 (Weak baseline):最频繁标签分类器,即将所有测试实例赋予训练集中最常见的标签。
- 例如,如果正常邮件占66%(意味着采用弱基准,认为所有邮件都是正常邮件的准确率为66%),那么一个分类器达到70%的准确率可能并不算好。
- 对于真正的研究,通常使用先前的工作作为(强)基准。
线性分类器
3.1 生物学启发
- 非常宽松地受到人类神经元的启发。结构包括细胞体、轴突、树突、突触等。

3.2 基本原理
- 输入是特征值。
- 每个特征有一个权重 (weight)。
- 激活值 (activation) 是特征值与对应权重的加权和:
- 决策规则 (二分类):
- 如果激活值为正,输出 +1。
- 如果激活值为负,输出 -1。

3.3 权重的作用
- 二分类情况:将特征与权重向量进行比较。
- 学习:从样本中找出权重向量。
- 特征向量 与权重向量 的点积 为正,意味着属于正类。
- 是一个向量!
3.4 二进制决策规则的几何解释
- 在特征向量的空间中:
- 样本是点。
- 任何权重向量定义了一个超平面 ()。超平面的一侧对应 ,另一侧对应 。

感知机 (Perceptron)
4.1 二进制感知机学习算法
- 初始化:权重 初始化为0
- 对每个训练实例:
- 用当前权重进行分类:
- 如果正确 (,其中 是真实标签),则权重不变。
- 如果错误,则调整权重向量:
4.2 多类感知机决策规则
- 如果有多个类别:
- 每个类别 对应一个权重向量
- 类别 的得分 (activation) 为:
- 预测:得分最高的类别胜出,
- 也就是说,和哪一个矢量点乘的结果最大,就属于哪一类

4.3 多类感知机学习算法
- 初始化:所有权重向量 初始化为0
- 逐个处理训练样本
- 用当前权重进行预测:
- 如果正确 (),权重不变。
- 如果错误 (预测为 ,实际为 ):
- 降低错误类别的权重:
- 提高正确类别的权重:
4.4 感知机的性质
- 可分性 (Separability):如果存在一组参数能够完美分类训练集,则称训练集是可分的。
- 收敛性 (Convergence):如果训练数据是可分的,二进制感知机最终会收敛。
- 错误界限 (Mistake Bound):二进制感知机在收敛前所犯错误的最大次数与间隔 (margin) 或可分程度有关。
- 可分情况:感知机可以找到一个分离超平面。
- 不可分情况:感知机无法找到完美分离的超平面,权重可能会持续调整。


4.5 感知机的问题
- 线性:决策边界是线性的
- 噪声 (Noise):如果数据不可分,权重可能会来回摆动 (thrash)。

- 泛化能力一般 (Mediocre generalization):找到的是一个“勉强”分离的解。
- 过训练 (Overtraining):测试集/留出集准确率通常先上升后下降,这是一种过拟合。

4.6 改进感知机
4.6.1 MIRA (Margin Infused Relaxed Algorithm)
- 思想:调整权重更新的幅度以减轻上述振荡的问题。
- 选择一个更新大小,该更新能够纠正当前的错误,同时最小化对的改变
- 优化目标:
- 找到一个新权重向量和旧权重向量的差的二范数最小
- 约束条件:
- 改变尽可能小,但是也要向正确的方向前进
- +1有助于泛化,且让计算机在比大小的时候不会出错
- 最小修正更新 (Minimum Correcting Update):
- 更新规则:
- 左边:降低错误类别的权重
- 右边:提高正确类别的权重
- 为了满足最小修正更新的要求,可以直接取等号:
- 代入,求解得更新步长:
- 如果,则 。
接下来,我们求解:
- 最大步长限制 (Maximum Step Size):
- 为避免过大的更新(可能由错误标记的样本或特征不足导致),限制的最大值:
- 通常比感知机收敛更快,表现更好,尤其在有噪声的数据上。
其中 C 是常数,是我们设定的最大步长
4.6.2 支持向量机 (SVMs)
- 目标:最大化间隔 (margin),这在直觉、理论和实践上都是好的。
- 解决普通感知机“勉强分离”的问题

- 支持向量:只有支持向量(离分离超平面最近的那些点)对决定超平面起作用,其他训练样本可以忽略。
- SVM 找到具有最大间隔的分离器。
- SVM 可以看作是 MIRA 在所有样本上同时进行优化。
- MIRA 目标(针对单个错误点):
- SVM 目标:
约束 。
约束 。
5. 超越线性模型:神经网络
5.1 线性模型的局限性
- 线性模型使用特征值 和权重 的加权线性组合:
- 看作向量的话,就是简单的特征向量·权重
可以被看作一个"网络"。
XOR 问题:线性模型无法对 XOR 函数建模(即无法用一条直线分开XOR的两种类别)。
5.2 多层网络与非线性
- 多层结构:增加一个或多个中间(“隐藏”)层进行处理,每条连接线代表一个权重。
- 非线性激活函数:在计算线性组合后,引入一个非线性函数
- 常用激活函数:



5.3 深度学习 (Deep Learning)
- 更多层 = 深度学习。
- 每一层都是一个处理步骤,多层处理允许构建复杂的函数。
- 类比:计算机 = 布尔门序列,神经网络计算机 = 层的序列。
- 深度神经网络可以实现复杂功能,如基于输入值排序。
5.4 简单神经网络示例

- 偏置单元 (Bias units):一种创新,没有输入,值恒为1,其权重可学习。
- 类似于一个外界的可调的输入,用于修正网络的行为
- 前向传播计算:
- 隐藏层计算:例如,某隐藏单元的激活值为
- 例如:
- 又如:
- 输出层计算:例如,输出单元的激活值为 。
- 例如:
- 该示例网络可以实现 XOR 功能。
- 隐藏节点 实现了 OR 功能,隐藏节点 实现了 AND 功能 (根据输入输出表格推断)。
- 深度神经网络的能力:通过处理步骤的链式组合实现复杂计算。

6. 神经网络的训练
6.1 核心概念:梯度下降与反向传播
- 误差 (Error):例如,计算输出 ,而正确输出 。如何调整权重以减小误差?
- 梯度下降 (Gradient Descent):
- 误差是权重的函数。
- 目标是减小误差,向误差函数的最小值移动。
- 计算梯度以获得指向误差最小值的方向。
- 沿降低误差的方向调整权重。

需要求出梯度
- 反向传播 (Back-propagation):
- 首先调整最后一组权重(输出层权重)。
- 然后将误差反向传播到前一层。
- 调整前一层的权重,依此类推。
6.2 反向传播的数学细节
6.2.1 Sigmoid 函数的导数
- 其导数为:
6.2.2 输出层权重更新
- 设线性组合为 (其中 是前一层激活或输入, 是权重)。
- 激活函数输出
- 误差函数(2范数): (其中 是目标输出)
接下来,我们计算的目标是:误差对某个权重 的导数(链式法则):
又有:
综合结果:
权重调整:
其中为学习率
6.2.3 多输出节点
- 如果网络有多个输出节点 :
- 总误差:
- 指向输出节点 的权重 的调整:
- 也就是计算误差的方式变了(考虑总误差),其它并没有变化
- 权重调整虽然看起来是“局部”的(只关心它指向的那个节点的误差),但其根本的数学依据和优化目标,依然是全局的“总误差 E”。每个权重都在为降低总误差 E 尽自己的一份(局部)力。
6.2.4 隐藏层权重更新
- 隐藏层没有直接的目标输出值
- 但可以计算每个节点对下游误差的贡献。
- 定义节点的误差项 :
- 对于输出层节点 :
- 对于隐藏层节点 (误差从后一层 反向传播)(其中 是节点 激活函数的导数)

- 通用更新公式:
其中,为学习率,是隐藏层的误差项,是输入;这个公式是通用的,对输出层节点也成立。因此,问题的关键变为了计算误差
- 权重的更新以节点为基本单位,更新所有指向该节点的权重
也就是说,更新A-D,B-D,C-D的权重时,是一样的只是后面的, , 输入不同
6.2.5 示例计算 (学习率 )

- 输出层 (G) 更新:设 , , (sigmoid(0.76)*(1-sigmoid(0.76)))
- (更新 从 4.5 到 4.5+0.391 = 4.891)
- (更新 从 -5.2 到 -5.2+0.074 = -5.126)
- (更新 从 -2.0 到 -2.0+0.434 = -1.566)
- 隐藏层 (D) 更新:设 , , (旧权重)
注意,隐藏层更新时还是采用的旧权重
6.3 向量与矩阵运算
- 前向计算: (其中 是前一层激活向量,W是权重矩阵)。
- 激活函数:。
- 误差项: (element-wise product)。
- 误差项传播:。
- 权重更新: (outer product)。
6.4 权重初始化
- 权重通常随机初始化,例如,从区间 [-0.01, 0.01] 均匀采样。
- Glorot 和 Bengio (2010) 建议:
- 对于浅层网络:范围 ,其中 是前一层的大小。
- 对于深层网络:范围 ,其中 是前一层大小, 是下一层大小。
6.5 用于分类的神经网络
- 预测类别:每个类别对应一个输出节点。
- 训练数据输出:
- "One-hot 向量":只允许输出0、1,表示分类结果
- 例如,对于3个类别,类别2表示为 或 (取决于索引)。
- 预测:允许输出分数
- 具有最高值的输出节点 即为预测类别。
- 通过 softmax 函数获得后验概率分布:
6.6 梯度下降训练中的问题
- 学习率过高:可能导致在最小值附近震荡或发散,无法收敛。

- 初始化不良:可能导致陷入较差的局部最优或训练缓慢。

- 局部最优 (Local optimum):梯度下降可能收敛到局部最小值,而非全局最小值。

- 过拟合(Overfitting)
6.7 训练优化与技巧
6.7.1 动量项 (Momentum Term)
- 目的:加速在一致方向上的更新,并抑制震荡。
- 保留先前更新的记忆,并将其(以衰减因子 )加到当前更新中。
- 更新规则:
其中, 表示先前更新的记忆。类比物理学中的动量
6.7.2 Adagrad(自适应梯度算法)
- 思想:为每个参数自适应地调整学习率,随着时间推移通常会降低学习率。实现学习率的自动调整。
- 更新规则:基于参数 在时间 的误差梯度 。
6.7.3 Dropout
- 问题:机器学习中的一个普遍问题是对训练数据的过拟合。
- 解决方案:正则化,例如防止权重值过大
- Dropout:在训练期间随机移除(“丢弃”)一些隐藏单元。
- Mask:定义哪些隐藏单元被丢弃。
- 随机生成多个mask (例如10-20个),在训练中交替使用。
- 原理:类似于集成学习 (bagging, ensemble) 的效果。
6.7.4 Mini Batches
- 每个训练样本都会产生一组权重更新 。
- 将若干训练样本批处理 (batch up)。
- 汇总它们的更新量。
- 将汇总后的更新量应用于模型。
- 主要是兼顾效率和硬件性能
6.8 GPU 加速
- 神经网络层可能包含大量节点 (例如200个)。
- 像 这样的计算需要大量乘法运算 (例如 )。
- 图形处理单元 (GPU) 专为此类计算设计。
- 图像渲染需要此类向量和矩阵运算。
- 大规模多核但精简的处理单元。
- 例如:NVIDIA Tesla K20c GPU 提供 2496 个线程处理器。
- CUDA 等扩展C语言的工具支持GPU编程。
常用工具包 (Toolkits)
- Theano
- Tensorflow (Google)
- PyTorch (Facebook)
- MXNet (Amazon)
- DyNet