<Machine Learning - 李宏毅> 学习笔记
b站视频地址:李宏毅<机器学习>2019国语
第一章 机器学习介绍
-
Hand crafted rules
-
Machine learning ≈ looking for a function from data
- Speech recognition
- Image recognition
- Playing go
- Dialogue system
-
Framework
- define a set of function
- goodness of function
- pick the best function
-
Supervised Learning 监督学习
- Regression
- Linear model
- Non-Linear model
- Classification
- Binary Classification
- Multi-class Classification
- Regression
-
Semi-supervised Learning 半监督学习
- Unlabel
-
Transfer Learning 迁移学习
- Data not related to the task considered
-
Unsupervised Learning 无监督学习
-
Structured Learning 监督学习中的结构化学习
- 输出有结构性
-
Reinforcement Learning 强化学习
- 没有答案,只有一个分数来判断行为好坏
- 当没有data的时候才会选择去做reinforcement learning.
第二章 为什么要学习机器学习
- 不同model,loss function损失函数解决不同问题
- 不一定能找出best function
- 需要有经验
- (loss function:通过最小化损失函数求解和评估模型 -参数估计/风险管理/最优控制理论)
第三章 回归 Regression
- 定义
- find a function
- Input:feature X
- Output:Scalar y
步骤
-
step1:模型假设,选择模型框架(Linear/Non-Linear)
-
step2:模型评估,如何判断众多模型的好坏(损失函数)
-
step3:模型优化,如何筛选最优的模型(梯度下降Gradient Descent)
-
learning rate 学习率
- 权重参数移动步长
- 设置不同的learning rate加强拟合速度 - 动态赋值
-
梯度Gradient:loss function对每个参数偏导排成的向量
-
梯度下降Gradient Descent:即更新参数的方式
- 新参数=原参数-学习率×原参数梯度
- 向量广播
-
梯度下降实现的挑战
- 问题1:当前最优(Stuck at local minima) - 局部最优点
- 问题2:等于0(Stuck at saddle point) - 一阶导为零的非极值点
- 问题3:趋近于0(Very slow at the plateau) - 导数极小
- 如果Loss Function是Convex(凸函数)- Gradient Descent找到的就是全局最优点
-
Overfitting过拟合
- 当特征越多,输入越多,数据量没有增加,可能就会导致Overfitting
- 过拟合:偏差小方差大 - 欠拟合:偏差大
- bias(偏差)影响loss function的上下 - variance(方差)影响loss function的曲平
步骤优化
-
step1:种类特征那个输入优化
- 类别特征通过δ函数合并优化输入 - 通常是做独热码one-hot
-
step2:更多参数,更多输入
- 特征与数据量的均衡,特征过多导致Overfitting过拟合
-
step3:Regularization正则化
-
更多特征,会造成某些特征权重w过大,导致过拟合,于此引入正则化 - 正则化影响loss function平滑度,所以与方差/过拟合相关
-
Regularization的一种简单方式就是在Loss Function中加入正则项λΣ(wi)2 - 使w更小,因为越小的w曲线越平滑,即对变化越不敏感
-
不敏感让loss function受高权重和噪音的影响小,降低过拟合风险
-
超参数正则系数λ也不能过大 - 导致bias变大,欠拟合,过于平滑
-
小结
- Gradient Descent梯度下降的做法
- Overfitting和Regularization的表象
第五章 误差从哪里来
-
Error = Variance + Bias
-
Bias偏差
-
Bias = 真实值与输出期望之间误差 - 模型越简单,bias越高
-
Bias大,即模型欠拟合Underfitting,解决办法一般是优化模型,增加更多特征
-
当Bias=0,即期望=真实值时,就是unbias无偏估计
-
-
Variance方差
-
Variance = 模型输出值与输出期望之间的误差 - 模型越复杂,variance越高
-
Variance大,即模型过拟合Overfitting,解决办法一般是增加训练数据量或者Regularization
-
方差 - 数据分布离散程度,越复杂的模型对不同数据集的分布差异越敏感,方差越大
-
-
Training set(训练) - Validation set(选择) - Testing set(上传)
- 训练集的划分方式 - K折交叉验证
第六章 梯度下降 Gradient Descent
- 新参数=原参数-学习率×原参数梯度
Tip 1:调整学习率
-
Learning Rate
-
too small:迭代次数过多,时间开销太大
-
too big:下降步长太大,可能无法达到最优点
-
Adaptive Learning Rate 自适应式 - 随迭代次数变小 :学习率除以根号(次数+1)
-
-
Adagrad算法
-
每个学习率都把它自适应式除以之前所有微分的均方根
-
wnew = wold - (η/σ)* g,其中η是自适应式, σ是w的过去所有偏导数的均方根Root Mean Square(包含本次).
-
Adagrad为了突出Grad的反差,即grad突然变大,Adagrad就让他变小些;grad突然变小,Adagrad就让他变大些
-
Gradient Descent的原理可以理解为:函数图像上某个点到该函数最小值的距离是正比一次微分(一阶导),反比于它的二次微分。所以 The Best Step = |一阶微分| / 二阶微分 。
-
AdaGrad就是利用了这个原理,用之前微分值的RMS近似二次微分值.(因为如果再计算二阶微分会增加很多时间成本)
-
Tip 2:Stochastic Gradient Descent 随机梯度下降
- 之前的Gradient Descent:Loss function = Σ(i误差)²
- Stochastic GD:Loss function = (K误差)² - 随机选取一个exampleK(随机选取小批量样本)
- 虽然每一步不一定走正确,但是耗时短,迭代次数多,总时间成本短。
Tip 3:Feature Scaling 特征缩放
-
各特征取值变化较大,导致不同特征的权重系数变化受影响
-
特征缩放 - 特征归一化:取值到同一个范围上
-
常见做法:(特征值 - 平均值) / 标准差
梯度下降理论基础
-
损失函数用泰勒展开式进行简化后(考虑一阶导足够)最后的式子就是梯度下降式子:前提是估算精度足够精确 - 也就是学习率足够小来保证
-
梯度下降的限制就是之前所说的三点挑战 - ≈0 / 鞍点 / 局部最小
第七章:分类 Classification
- 分类问题不能将结果化为单一数值化(如class1-1,class2-2...),如果这样做则表明不同类之间有明显的联系,实际上可能并没有。
概率与分类
-
Generative Model 生成模型
- 生成一个x,可以计算某个x出现的概率,知道了x的分布,就可以自己产生X
- P(x) = P(x|C1)P(C1) + P(x|C2)P(C2)
-
Prior probability 先验概率
- 分类概率 P(C1|x) = P(x|C1)P(C1) / (P(x|C1)P(C1)+P(x|C2)P(C2)) - 全概率公式
-
Gaussian Distribution 高斯分布
-
P(x|C1)就算x未在C1中出现,也不能说概率为0,其概率值满足正比于高斯分布Gaussian Distribution - fμ,Σ(x)
-
满足C1数据集的高斯分布不止一个,对应的(μ,Σ)也不止一个,所以用 Maximum Likelihood 最大似然估计去拟合出最大可能性的高斯分布fμ,Σ(x) - L(μ,Σ)max
-
-
模型优化
- 通常而言,如果每个类别都用不同的高斯分布,会导致协方差矩阵参数过多,容易过拟合 - 所有class都用同一个高斯分布 L(μ1,μ2,Σ),得到的边界是线性边界
概率模型 - 建模三部曲
-
Step 1:function set P(Ci|x) - 概率分布模型
-
Step 2:Goodness of function
-
(μ,Σ) - 计算跟dataset假设满足的分布相关
-
高斯分布
-
二分类常假设符合 Bernoulli distribution 伯努利分布
-
假设所有类别独立产生,则这种分类称为 - Naive Bayes Classifier 朴素贝叶斯分类器:概率生成模型+先验概率
-
-
the licklihood - L(μ,Σ) 最大可能性
-
-
Step 3:Find the best:easy
Posteriori Probability 后验概率
- 先验概率:P(C1|x) = P(x|C1)P(C1) / (P(x|C1)P(C1)+P(x|C2)P(C2))
P(C1|x) = P(x|C1)P(C1) / (P(x|C1)P(C1)+P(x|C2)P(C2))
= 1 / (1 + P(x|C2)P(C2) / P(x|C1)P(C1))
= 1 / (1 + exp(-z))
= σ(z)
其中 z =ln[ P(x|C1)P(C1) / P(x|C2)P(C2) ]
- σ(z) - Sigmoid函数
- N1=P(C1),N2=P(C2)
- 代入P(x|Ci),结论:z = w(μ1,μ2)·x+b(μ1,μ2,Σ,N1,N2) - 过程略
- 最后得到的z是一个线性的,说明了当共享协方差矩阵的时,为什么分界线是线性的。 - σ(z)让边界非线性
第八章:逻辑回归 Logistic Regression
步骤
-
Step 1:Function set - 后验概率
-
z = Σwixi+b - 向量
-
f(x) = Pw,b(C1|x) = σ(z)
-
-
Step 2:Goodness of function 定义损失函数
-
Ci类可能性 L(w,b) = ∏f(xi) - 每个样本求积,是Ci类则f(xi),不是Ci类则(1-f(xi))
-
损失函数变换:最大化L(w,b) - 最小化 -lnL(w,b)
-
Loss function = -lnL(w,b) =Σ - [ ylnf(xi) + (1-y)ln(1-f(xi)) ]
-
实际上是两个伯努利分布(0-1分布,两点分布)的 Cross Entropy(交叉熵)
-
两点分布:
-
p(x=1)=y - p(x=0)=1-y
-
q(x=1)=f(x) - q(x=0)=1-f(x)
-
-
Cross Entropy:H(p,q) = -Σp(x)ln(q(x) - 交叉熵代表的含义是这两个分布有多接近,所以直观上理解就是希望这两个伯努利分布越接近越好
-
-
-
Step 3:find the best function
-
参数更新还是用Gradient Descent.
-
wnew = wold - η·Σ-(y-f(xi))xi
-
学习率η后部分直观上看就是真正的目标 y与我们的function差距有多大。
-
损失函数为什么用交叉熵而不用线性模型的平方误差:
- 因为当f(x)距离y很远的时候,平方误差斜率很小,收敛很慢;而交叉熵斜率很大,收敛很快,效果非常好。
-
Discriminative 判别模型 vs Generative 生成模型
-
-
之前用高斯分布描述后验概率得到的L(w,b) - Lossfunction称为 Generative 生成方法。
-
Step 2对L(w,b) 做了取负取对数得到的-lnL(w,b) - Loss function称为Discriminative 判别方法
-
-
-
如果是概率生成模型,后续方法就是按上述计算出μ1,μ2,协方差矩阵的逆再得到w,b
-
如果是逻辑回归,后续方法就是用梯度下降迭代收敛得到w,b
-
两者最终得到的w,b是不一样的
-
-
-
在数据量少的情况下,Discriminative < Generative - 语音识别就是用的先验概率
-
Discriminative看训练集来计算 - Generative看分布,数据量少时有脑补能力(先验)
-
多类别分类 Multi-class
-
zi = wixi+bi
-
softmax函数
- 计算每个类别的ezi, 并且将这个值除以Σez作为输出概率yi,最大的yi就是所属类别
- softmax - 估计后验概率
-
为什么softmax用来作为后验概率
-
假设分类高斯分布且共用一个协方差矩阵可得到softmax
-
Maximum Entropy 最大熵也可得到softmax
-
二项式的最大熵解等价于二项式指数形式(sigmoid)的最大似然,多项式分布的最大熵等价于多项式分布指数形式(softmax)的最大似然
-
为什么用sigmoid函数,因为指数簇分布最大熵的特性的必然性。
-
-
Limitation ofLogistic Regression
-
逻辑回归在二分类中决策边界是一条直线,有时候无法正确分类
-
解决方法:
- Feature Transformation 特征转换
- 比如降维
- 特征转换后再用逻辑回归
- 级联逻辑回归模型
- 用多个逻辑回归连接一起做成级联进行特征转换,最后再用一个逻辑回归分类
- 这种结构就是 Neural Network - 神经网络,每一个单元称为 Neuron - 神经元
- Feature Transformation 特征转换
第九章 深度学习简介
-
步骤
-
神经网络
-
模型评估
-
选择最优函数
-
-
Step 1:神经网络
-
Fully Connect Feedforward Network FCN
- Input Layer:1 Hidden Layer:N Output Layer:1
- Fully Connect:每两层之间各神经元都有连接
- Feedforward:前馈,数据信息往前传递
-
激活函数:sigmoid(权重w* 输入+偏移量b)= 输出 - 现在很少用sigmoid作为激活函数了
-
每一层的输出作为下一层的输入
-
本质:中间的隐藏层进行特征转换(黑箱操作)
-
深度学习中网络机构尤为重要,决定了功能集
- 比如Layer数量和Neuron数量
-
-
Step 2:模型评估
-
每一层的Loss function
- 一般采取 Cross Entropy 交叉熵进行损失计算,越小越好
-
Total Loss = Σ每一层的Loss function 迭代参数使其最小化
-
-
Step 3:选择最优函数
-
随机初始值再迭代参数 - Gradient descent 梯度下降
-
计算 dL/dw 的梯度微分项,一般的方法就是用 Backpropagation 反向传播计算。
-
反向传播 Backpropagation - BP
-
dL/dw = dL/dz * dz/dw - 根据链式法则梯度进行拆分
- dL/dz:Backward pass部分,从该层的的Output向前计算得到
- dz/dw:Forward pass部分,从该层的Input向后计算得到
-
Forward pass = dz/dw 就是输入的xi
-
Backward pass = dL/dz 就是计算激活函数的偏导
-
z':a=σ(z)输入后一层输出的第一行z - z'':输入后一层输出的第二行z
-
z'=w1a+b1 - z''=w2a+b2
-
dL/dz = da/dz * dL/da
= σ(z)‘ * [ dz'/da * dL/dz'+dz''/da * dL/dz'' ] ......-
一直链式法则分解下去,直至到最后的输出:y1=z',y2=z'',都是常数值了
-
dL/dz' = σ(z')' - dL/dz'' = σ(z'')'
-
实际计算从最后面一步一步往前计算出所有的Backward pass - 顾名思义反向传播,计算量就跟Forward pass的计算量一样
-
-
-
加上反向传播的训练过程就是:
- 从前往后Input - Output,中间存储产生的σ(z)' 值
- 再从后往前bp,知道本层的σ(z)' +下一层的σ(z)'
- 则可以得到梯度微分项,进行梯度下降迭代参数。
第十章 “hello world”of deep learning
-
Keras - tensorflow的后台API,很容易学习和使用,灵活性也有一些
-
Step 1:定义模型
-
创建模型:Sequential() 顺序模型,由多个网络层线性堆叠
-
模型添加层:model.add()
-
全连接层 Fully Connect Layer - Dense()
-
卷积层 convolution layer - Con2d()
-
Keras1.0 激活函数 Activation() - softplus softsign sigmoid relu tanh linear hard-sigmoid softmax / Keras2.0 activation参数
-
输入维度 Input_dim参数 - 只需要在第一次输入填,如 20 * 20
-
Keras1.0 输出维度 Output_dim参数 - 输出维度 / Keras2.0 神经元 units参数
-
model = Sequential()
## keras1.0
model.add(Dense(input_dim=28*28,output_dim=500)) ## 输入28*28,输出500*1
model.add(Activation('sigmoid'))
## keras2.0
model.add(Dense(units=500,activation='relu'))
model.add(Dense(units=10,activation='softmax'))
- Step 2:模型评估
-
complie() - 编译
-
loss = 'cateqorical crossentropy' - 定义损失函数,分类交叉熵
-
optimizer = 'Adam' - 优化器
-
metrics = ['accuracy'] - 评价指标
-
model.compile(loss = 'cateqorical crossentropy',
optimizer= 'Adam'
metrics=['accuracy'])
- Step 3:最佳模型
-
3.1 配置优化器:比如上图选用的是 'Adam' - SGD, RMSprop, Adagrad, Adadelta, Adam, Adamax, Nadam
-
3.2 输入数据训练最优的网络参数 Find the optimal network parameters
-
模型训练函数:model.fit()
-
Training data,Labels参数 - 在手写数字识别中:numpy array 输入的像素点 28 * 28 = 784 就是每个数据的特征 * 数量,输入label就是 10个类别 * 数量
-
训练批数 batch_size,迭代次数 nb_epoch (Mini-batch:不会每次求最小的total loss,而是一批一批的进行训练)
-
-
Mini-batch GD = Stochastic Mini-batch Gradient Descent 随机小批量梯度下降
-
批量梯度下降比随机梯度下降速度要快(batch_size=1):因为利用计算机的并行运算和矩阵运算,计算速度快很多 - GPU
-
batch_size需要设置合适,过大变成普通梯度下降,过小变成随机梯度下降
-
-
model.fit(x_train, y_train, batch_size =100, nb_epoch = 20)
- 模型的验证和预测
- model.evaluate():返回一个二维向量,一个是训练集的total loss,一个是测试集的accurary
# case1: 测试集正确率
score = model.evaluate(x_test,y_test)
print("Total loss on Testing Set:",Score[0]) ## 总损失值
print("Accuracy of Testing Set:",score[1]) ## 正确率
# case2: 模型预测
result = model.predict(x_test)
第十一章 Keras - 手写数字识别(1)
import numpy as np
from keras.models import Sequential
from keras.layers.core import Dense,Dropout,Activation
from keras.optimizers import SGD,Adam
from keras.utils import np_utils
from keras.datasets import mnist
def load_data():
(x_train,y_train),(x_test,y_test)=mnist.load_data() ##导入数据
number=10000
x_train=x_train[0:number] # 只训练10000数据
y_train=y_train[0:number]
x_train=x_train.reshape(number,28*28) # 重塑
x_test=x_test.reshape(x_test.shape[0],28*28)
x_train=x_train.astype('float32')
x_test=x_test.astype('float32')
y_train=np_utils.to_categorical(y_train,10) ## 标签one-hot编码
y_test=np_utils.to_categorical(y_test,10)
x_train=x_train
x_test=x_test
x_train=x_train/255 ## 归一化
x_test=x_test/255
return (x_train,y_train),(x_test,y_test)
(x_train,y_train),(x_test,y_test)=load_data()
model=Sequential()
model.add(Dense(input_dim=28*28,units=633,activation='sigmoid'))
model.add(Dense(units=633,activation='sigmoid'))
model.add(Dense(units=633,activation='sigmoid'))
model.add(Dense(units=10,activation='softmax'))
model.compile(loss='mse',optimizer=SGD(lr=0.1),metrics=['accuracy'])
model.fit(x_train,y_train,batch_size=100,epochs=20)
result= model.evaluate(x_test,y_test)
print('TEST ACC:',result[1])
- 调参:中间层神经元个数,深度 - 就算如此,深度学习的实践还是需要基于理论基础而非调参。
- 深度学习并非越深越好,隐层Neture调整对整体效果也不一定有益
第十二章 深度学习技巧
-
Tips1 针对神经网络的表现:
-
如果在训练集上表现不好,那么就需要去调整网络;如果在测试集上性能不好,才是过度拟合;如果在测试集上表现很好,就说明成功了。
-
在机器学习中往往训练集集合是很好的,但是在深度学习中并非这样,我们首先就需要查看训练集上的结果 - 因为深度学习的模型是不可解释性的,最初模型往往没有机器学习模型好。
-
eg. dropout方式是用来防止过拟合的,即训练集数据表现好,测试及数据表现不好的时候使用,而非任何时候都可以添加。
-
-
Tips2 针对新的激活函数:
-
如果训练集上效果不好,有可能是因为你的激活函数或者自适应学习率算法设计的不够好(New activation function & Adaptive Learning Rate)。如果在测试集上效果不好,此时再去设计一些如减少迭代次数,正则化,Dropout等方法(Early Stopping, Regularization, Dropout)
-
不同激活函数的设计带来的其中一个问题就是当网络比较深的时候会出现梯度消失:Vanishing Gradient Problem
-
比较靠近输入的几层梯度非常小,靠近输出的梯度非常大,当前几层参数都还没更新多少的时候,后几层参数就已经收敛了 - 使用
sigmoid激活函数时会产生 -
原因是我们对一个参数
w做total loss偏微分,实际上就是在该方向上做个小小的变化,对loss的影响就是梯度大小。 -
给我们第一个层的某个参数加上△w时,对输出与目标之间的损失有某种形式的变化。现在我们的△w很大,通过sigmoid函数时这个输出会很小(一个大输入,,通过Sigmoid函数,得到较小的输出),每经过一次sogmoid函数就会衰减一次(因为sogmoid函数将值压缩到0到1之间,将参数变化衰减),隐藏层很多的情况下,最后对损失的影响非常小,看作是梯度消失了。(对输入修改一个参数其实对输出是影响是非常小)。
-
理论上我们可以设计动态学习率来避免梯度消失这个问题,但是如果直接改激活函数更为直接,eg. 使用ReLU,具体好处可以看论文笔记:< AlexNet - 论文研读系列(1) 个人笔记 >
-
ReLU还有两种优化改进:分别是
Leaky ReLU和Parametric ReLU。除此之外,激活函数还有ELU,和一种可以让网络自动学习的激活函数,这种称之为Maxout。Maxout就是将前输出Zi每k个划分为一个Group,每个Group只输出最大的,其他k-1个舍弃。Maxout的拟合能力是非常强的,它可以拟合任意的的凸函数。但是它同dropout一样需要人为设定一个k值,这使得应用Maxout的层的参数个数成k倍增加,原本只需要1组就可以,采用Maxout之后就需要k倍了。
-
-
Tips3 适应性学习率:
-
Adagrad
-
RMSprop
-
Momentum 动量
-
Adam
-
-
Tips4 测试集效果差:
-
Early Stopping
-
Regularization
-
Dropout
-
Dropout能够提升模型性能有很多理由,其中一种比较能接受的理由是:Dropout是一个终极ensemble方法
-
ensemble的意思是:我们有一个很大的训练集,每次从训练集里面只取样一部分的数据。
-
-
第十三章 Keras - 手写数字识别(2)
-
把激活函数换成了relu,结果accuracy非常高,test上都有95.64%。
-
归一化:
x_train=x_train/255,x_test=x_test/255,对结果影响非常大,直接从原来的95.64%降低到了10% -
把优化器SGD改成了Adam,发现最后收敛的地方查不到,但是上升速度特别快。
-
假设给测试集上每个像素点随机加上噪声,结果发现准确率直接掉到了56%,说明在生成对抗网络这方面很重要。
-
在噪声的基础上使用dropout(因为训练集好测试集差),训练集有少许下降,但是测试集正确率有所提升。
第十四章 卷积神经网络
-
全连接 vs. 卷积网络
-
全连接Dence需要将矩阵拉成矢量. eg. 输入100 * 100 * 3的像素拉成的30000维,会极大增加网络参数
-
CNN相比简化网络架构,使用卷积会对输入进行过滤。
-
-
CNN卷积核
-
对于一张图来说,比如我们需要检测鸟嘴其实只需要检测图片的一个小区域即可。每一个卷积核要做的事就是发现某一种模式,有没有某种模式的出现,这样不用对整张图片进行处理,可以减少参数。
-
同样的模式在图像里面,可能出现在图像的不同部分,但是代表的是同样的含义同样的形状,所以卷积核需要从头扫描到尾,这样不需要多个相同功能的神经元,减少了需要参数的量。
-
对于一个图像而言,我们可以把奇数行,偶数列的像素拿掉,变成原来十分之一的大小,依然不会影响人对该图的理解。所以即使我们对图像进行
subsumpling子采样,减少了需要的参数和输出维度大小,也不会造成差异。
-
-
CNN架构:-
输入图像,通过卷积层
convolution卷积操作,再通过池化层做max pooling等池化操作。几层卷积几层池化全部是超参数需要人工调参。之后将卷积或者池化输出flatten展平连接到完全连接前馈网络FCN得到结果 -
卷积 - 生成模式并观察,通用的模式找到目标。池化 - 对卷积结果进行子采样减少参数。
-
Convolution卷积:Filter卷积核/过滤器 三种填充模式(full,same,valid - padding)stride 步长 卷积核大小 卷积核数量 输入图像大小 计算输出大小 卷积核点乘计算
-
Max Pooling最大池化:Filter池化过滤器 也是三种模式 stride 步长 Filter池化核大小 计算输出大小
-
第一层:卷积层1,输入为
3@227x227的图像,卷积核的数量为96(自定义); 卷积核的大小为3@11x11(自定义);stride = 4(自定义),stride表示的是步长,pad = 0, 表示不扩充边缘;
wide = (227 + 2 x padding - kernel_size) / stride + 1 = 55
height = (227 + 2 x padding - kernel_size) / stride + 1 = 55
dimention = 96
最终第一层卷积的输出为96@55x55
参数个数:3*11*11*96=34848
第二层:池化层1,输入96@55x55矩阵,池化pool_size = (3, 3),stride = 2,pad = 0,最后输出96@27x27
-
CNN in Keras:
-
创建卷积层:model.add(Convolution2D(..., input_shape()))
-
eg. model.add(Convolution2D(25,3,3,input_shape(28,28,1)))
-
25个3 * 3的卷积核 -
创建的不是
vector,而是一个tensor三维张量,1@28 * 28
-
-
创建池化层:model.add(MaxPooling2D())
-
eg. model.add(MaxPooling2D(2,2))
-
表示池化区域
2 * 2
-
-
将张量展开向量:model.add(Flatten())
-
-
CNN学到了什么?
-
第一层卷积每个filter在对输入的图像进行过滤,试图捕捉到什么东西。
-
第二层卷积每个filter扫描的输入区域实际上比image更大。我们定义一个东西叫做:"Degree of the activation of the k-th filter"第K个过滤器的激活程度。每个filter与输入做的点乘运算就是要求这个filter的激活程度。
-
我们想知道第K个filter作用是什么就是我们要找一张image,使得第K个filter被激活程度最大。这件事课可以用
gradient ascent梯度上升来做(最小化用梯度下降,最大化用梯度上升)-
这样看很神奇,我们训练模型找合适的参数是做梯度下降,而现在是相反过来参数固定我们找合适的图片做梯度上升来让这个filter的激活程度最大。
-
投入数据集,可以发现让filter激活程度很大的图片,对应的就是一种模式pattern,比如竖直的直线,比如指向右上的直线。
-
所以可以发现,CNN网络实际上是通过不断的层数深入在提取图像更深层次的特征,是一种自动提取图像特征的网络。
-
-
每个filter只是在做自己单独的模式,如果直接输出到后续网络同样也是对某个单独模式进行处理,而flatten将其展平,那么后面的FCN处理的就是相当于去看整张图而非局部。
-
deep dream, deep style都是借鉴了这样了应用
-
deep dream训练如果输入图像有类型动物的特征,那么filter会放大这样的特征,到最后输出的时候图像上真的强化成了动物;
-
deep style训练将输入图像的context内容和filter训练好的风格结合,filter会将图像强化成他之前训练的风格,比如相近颜色,曲线程度等,(梵高风格),最后输出的也就是这样风格的原图像。
-
-
-
什么时候该使用CNN?
-
必须有image有的那些特性,就是最上面卷积和池化对应的三点:局部,不同地方重复,缩小。比如围棋,只需要观察局部棋位,eg. 一个白字被三个黑子围住,这就可以是一个pattern;这个pattern可以出现在围棋的不同地方,不过对于第三点而言围棋不能抽空行和列,表示对池化层实际上是不需要的。 - 所以在AlphaGO的CNN架构里并没有池化层出现。
-
除了图像image,CNN还可以用在影像处理上,比如声音的时频图Spectrogram,此时横轴时间竖轴频率,filter往频率方向移动而不往时间方向,因为一般后续会接的LSTM专门处理时间上的特征,filter处理频率上的pattern。
-
CNN还可以运用在文本处理上,此时横轴人类阅读方向sentence,竖轴称之为embedding dimension嵌入尺寸(相当于每个单词中间连接部分),在文本处理中filter朝嵌入尺寸上移动是没有意义的,所以是往阅读方向移动,每个filter得到各自的vector,对应的是每个word的sementic,如果两个word含义越接近,那么他们的vector在高维空间上也就越接近,这个叫做word embedding词嵌入(相当于这两个word组成词的概率越大)
-
第十五章:为什么要“深度”学习
-
将网络变高(单层size增加)可能performance没有效果,将网络变深(layer增加)可能有效果。
-
deep learning实际上是在做Modularization模块化的事情,每个层实际上就是对应将输入进行模块化处理。用一层网络能做的事多层网络更有效率,并且可以减少每层的layer降低参数防止overfitting,减少训练所需样本量。
-
很多层的设计还可以很好的处理类内差异性和类间相似性
-
-
深度学习另一个好处就是端到端End-to-end learning
- 处理的问题非常复杂,但是只需要给予model input和output,不需要告诉中间每个function具体分工。
第十六章 Semi-supervised learning 半监督学习
-
半监督学习:数据集分为
label&unlabel两组,unlabel数量远多于label数量。-
Semi_supervised分为Transductive learning和Inductive learning,前者unlabeled data是测试集,后者不是测试集。
-
产生半监督学习的原因有两点:人类的学习方式就是半监督学习;收集数据很简单,但是收集带标签的数据很花费代价。
-
半监督学习往往考虑unlabeled data的分布,使用unlabel的方式往往伴随一些假设条件,并且半监督学习效果往往取决于这些假设符不符合实际或者颈部精确。
-
-
generative model 生成模型:学习得到联合概率分布P(x,y),即特征x和标记y共同出现的概率,然后求条件概率分布。能够学习到数据生成的机制。(生成模型 vs. 判别模型 )
- 监督生成模型:假设每个class分布都是一个高斯分布,根据数据集会得到各自的
μ和Σ,我们就可以根据测试集的data做classification,并得到boundary决策边界位置
- 监督生成模型:假设每个class分布都是一个高斯分布,根据数据集会得到各自的
-
半监督生成模型对unlabeled date进行分类:
-
实现初始化参数,class1,class2的几率P,μ1,μ2,Σ1等,我们可以随机也可以使用
labeled data进行估测,这些参数统称Θ -
我们先根据现有的
Θ计算出unlabelled data中属于class1的概率 - 根据高斯分布 -
然后算出这个概率后,开始循环update更新模型(更新参数)。
-
(Pleft ( C_{1} ight ) = frac{N_{1}+sum_{x^{u}}^{ }P(C_{1}|x^{u})}{N})
-
({mu}^{1}=frac{1}{N}sum_{x^{r}epsilon C_{1}}^{ }x^{r}+ frac{1}{sum_{x^{u}}^{ }P(C_{1}|x^{u})}sum_{x^{u}}^{ }P(C_{1}|x^{u})x^{u})
-
-
理论:最大似然估计,将所有加起来就是log total loss,接下来就是maximum迭代求解。(因为不是凸函数)
-
-
半监督生成模型常见的两个假设:
-
① Low-density Separation:意思是两个类别之间会存在一个很明显的决策边界,在决策边界处两个类的
density密度都很低。-
在该假设下最简单的方法是
self-training:意思是label data训练出一个model,然后用这个model去求求unlabel data的label,这个label称之为Pseudo-label伪标签,之后再把这些新数据训练之前得到的model。 - 这种方法不能用来做regression回归,因为新加入的数据不会影响原model -
self-training与之前的generative model相比,他们唯一的差别是hard label与soft model,前者强制unlabel属于某个class,而后者则是unlabel属于哪个class更好。显然hard比soft要好,因为soft是相当于自己证明自己,没有实际work。如果使用nerural network也是使用这种hard label的方式。 -
在上基础上进阶就是
Entropy-based Regularization基于熵的正则化。 我们在nerural network输出分类分布(概率)时,我们希望在某个class上几率很大,这样我们认为这个结果很好。那么我们用label data上的cross entropy evaluate加上unlabel data的entropy作为损失函数来评价分布好坏。在这里unlabel data很像梯度下降中的正则项,同样作用也是不让模型overfitting。 -
除上之外还有
Semi-sipervised SVM半监督支持向量机。SVM做的事就是根据输入的数据集,找到一个决策边界,一方面边界要有最大的margin余量(就是让这两个class分的越开越好),同时也要有最小的分类错误。SVM会穷举unlabel data所有可能的label,对每一个可能结果做一个SVM,然后找到最合适的label让margin最大且minimize error
-
-
② Smoothness Assumption:表面意思是如果
x是相似的,那么label就应该相似。精确假设是x的分布是不均匀的,在某些地方集中某些地方分散,如果x在high density region高密度分布区域是相似的,中间是通过high density path相连,那么其label就应该是相似的。(就类似中间有过渡态,这些过渡态密集相当于这些都属于同一个class)-
这在文章分类上十分有用,比如分类天文学和旅游类,每个类都有一个固定的
word distribution,如果收集的unlabeled data足够多的话,那么就可以进行上述的平滑假设。 -
实践平滑假设最简单的方法就是
cluster and then label分类再标记。这个方法在image图像里不一定有用,分类产生的cluster聚类一定要强,一般会使用deep autoendcoder深度自编码器提取特征后再进行聚类。 -
除上之外,另个方法是
Graph-based Approach基于图路径,我用图路径来表达高密度路径连接,把所有的数据点建成一个图,high density path意思就是如果在图上是相连的,那么他们就是同一个class,如果没有相连,则即使实际距离不远也不算一个class。(图神经网络) -
这种基于图的表示方式可以例如网页的分类,论文的分类等。一般用auto-encoder自编码器来计算
<Xi, Xj>的相似度。计算完相似度后就可以建图。KNN就是一种这样的模型,设K为一个值,每个point跟它最近的三个point做标记,每个点只有跟它相似度超过一个threshold阈值,才会被连接起来,KNN选择的相似度计算是用的Gaussian Radial Basis function高斯径向基函数(<Xi, Xj>的距离乘以一个参数再取负算exp()指数)。基于图真正帮助的是它的class分类是会传递的,要想有效则需要训练数据集足够。 -
刚才是定性的使用graph图,接下来定量的使用graph图。在图结构上定义
label的smoothness平滑度,只考虑两两有相连的point,然后公式为计算$ S = frac{1}{2}sum { omega _{i,j}(y{i}-y{j})^{2} }$,不管是否有label的data都要算,smothness越小越好。 -
将上式整理,改写成简洁式:$ S = y^{T}Ly $,y = [..yi..yj..]T,y:(R+U),L=D-W,L:(R+U) * (R+U),W是所有权重的组合,D是所有权重叠加的对角矩阵。L称之为
Graph Laplacian图拉普拉斯算子。 -
可以把
smoothness加入deep neural network的任何层输出,只要把某个hidden layer接出来再乘上转置它也是smoothness。
-
-
第十七章 Unsupervised Learning 无监督学习 - 线性降维
-
无监督学习分为两种:
-
Clustering & Dimension Reduction 聚合和降维(化繁为简):只有输入没有输出/标签 - 本节主讲线性降维
-
Generation 生成(无中生有):只有输出/标签没有输入
-
-
Cluster 聚类:
-
聚类需要多少个cluster簇,跟神经网络层数一样属于超参,根据经验调整。(使用肘部图)
-
在聚类中最常用的是K-mean K均值方法。首先人工确定有k个中心,然后初始化从数据集中随机选k个/直接确定k个作为簇中心。每个数据集只属于最接近的集群类,每更新一次集群都要更新一次簇中心坐标。
-
聚类另一种方法叫做
Hierarchical Agglomerative Clustering HAC层次聚类。这个方法首先建立一棵树,把把每个样本两两计算相似度,然后挑选最相似的那个配对,之后将挑选出来的两个样本合并平均得到新样本向量,再与剩下的样本循环上述操作。分层完后做集群,集群是根据层的切分来进行聚类。- K-mean和HAC最大的区别是,K-mean需要自己决定集群数目,而HAC不需要自己决定有多少集群,或者只需要去切分树层次。
-
-
Distributed Representation 分布式表示:聚类因为非黑即白,有时候会以偏概全。我们可以用分布式表示,用向量来表示结果,每个维度都表示某一种特值。
- 假设我们原来的输入是高维度的东西比如图像,现在输出用低维度来代表,这件事就被称之为降维。是同样一个东西,只是不同维度的称呼而已。
-
Dimension Reduction 降维:
-
因为有时候多维浪费资源,使用低维可以完全代替高维特征。做降维也就是在做尺寸缩小。
-
降维里面最简单是Feature selection特征选择,就是人工选取特征,筛除不需要特征,但一般情况下是任何一个
dimension都不能拿掉。 -
另一种常见的降维方法叫
Principe Component Abalysis PCA主成分分析。PCA做的方式就是将输入和输出做一个线性变换:x在w方向上做映射,现在要做的就是根据输入x求出变换矩阵w。$ PCA:z = Wx $-
我们希望选一个
w方向,输入x经过投影后得到的z分布是越大越好,这样意味着很少的点重合,点与点之间的差异度还在。即 $ Var(z _ {i}) = Σ(z _ {i} - overline{z _ {i}} )^{2} , vert w^{i} vert_{2}=1, w^{i} * w^{j} = 0$,Var尽可能小,w是一个正交矩阵。 -
PCA:$ Var(z _ {1}) = frac{1}{N}sum (z _ {i}-overline{z _ {i}} )^{2}= frac{1}{N}sum(omega ^{i}cdot (x-overline{x})^{2})$
-
$ = (omega {i}){T}frac{1}{N}sum(x-overline{x})(x-overline{x})^{T}omega ^{i} = (omega {i}){T}Cov(x)omega ^{i} = (omega {i}){T}Somega ^{i} $,现在讲就是在
w的约束下求Var的最大值。 -
S是协方差矩阵,又是半正定,就是说所有的特征值都是非负的。这个问题的解决就是(w^{i})是S的特征向量。
-
中间过程首先用
lagrange multiplier拉格朗日乘数法求解最大值时的w:对所有的w做偏微分令其等于0,然后带入看w为多少,可使拉格朗日系数α最大为S的最大特征向量。每个w都进行此带入求解,依次带入α,β,γ..,它们是S的第一、第二、第三大等的特征向量。 -
之后求解
z,发现z的协方差是对角矩阵,也就是说假设你用PCA得到的feature(z)不同的dimension之间没有解相关,这样保证新特征没有一个维度是多余的,减少参数量,避免overfitting。 -
从另一个角度来看
PCA,假设手写数字识别,这些数字实际上是由basic component基本构件组成的,比如笔画,我们将这些基本构件写成向量,把这些向量加起来就代表一个数字。每张图里面的pixel像素都可以看作是:$ x≈c _ {1}u^{1}+...+c _ {k}u^{k}+overline{x} $,这是一堆构件的linear conformation线性函数关系。 -
对上式变形:$ hat{x} = c _ {1}u^{1}+...+c _ {k}u^{k} ≈ x-overline{x} (。我们需要找`K-vector`使得) hat{x}(跟)x-overline{x} $越接近越好。我们用
reconstruction error重建误差来表示两者之间的差,接下来就是要minimize这个误差。 -
对此使用
SVD奇异值分解来找到最优K-vector。我们将x拆成$ U_{MxK} · Σ_{KxK} · V_{KxN} (,其中`U`总共有`K`个`orthonormal vector`正交向量,对应到)XX^{T}$最大的K个特征向量。实际上就是之前上种推导的w,所以说w就是component构件。 -
用SVD进行矩阵分解,他分解出来的两个矩阵可正可负,如果遇到负值在PCA中是不知道如何处理的,因此我们也可以用
Non-negative matrix factotization NMF,他会强迫所有的component weigth都是正的。
-
-
PCA看起来类似神经网络的一层,用的线性激活函数,PCA相比单层网络而言更为简单,但是网络相比的优点就是可以
deep。PCA有些明显的弱点,一是无监督,PCA让数据降到一个可让数据差异最大的低维,但这样可能使得本是不同的class数据被merge合并到了一个类上。这个时候就需要引入label data,改变成LDA降维方法。二是Linear线性,他只能进行线性降维,而不能类似将w方向曲线化再映射投影。之后会提到non-linear的降维方法。PCA有个特性是:它保留了原来在高维空间中的距离关系。 -
dimension reduction除此之外还有很多方法,比如MDS(它不需要把每个数据都表示成特征向量,只需要知道各特征之间的距离,效果类似于PCA),概率版本PCA -probability PCA,非线性版本PCA -kernel PCA,Canonical Correlation Analysis CCA典型相关分析
-
-
Matrix Factorization MF 矩阵分解
-
人和物之间经常会有个矩阵关系,比如人和电影评分,人拥有公仔数量。每个人和每个物后可以用一个二维
vector来代表其属性,两者矩阵中对应element元素可以看做是两个vector的inner product内积。那么中间的矩阵({Matrix} _ {MxN})就可以看作是({R^{人}} _ {MxK})和 $ {R^{物}} _ {KxN} $ 相乘。两者之间的Matrix Error越小越好。- 这个时候可以用
SVD分解,把中间的Σ归并到左右或者右边即可。然后对其进行minimize error即可。
- 这个时候可以用
-
MF在Recommended system推荐系统中的应用:对上述矩阵而言有时候一些信息是不知道或者丢失的,比如不知道我给A电影的评分,那么使用SVD分解就可能无法进行,这个时候我们可以直接用gradient descent梯度下降的方式来做,写一个loss function:(L=Σ _ {(i,j)}(r^{i} * r^{j} - n _ {ij})^{2}),在求和时只计算有值部分。要求得两边vector后就可以内积求解矩阵未定义部分。- 对上述模型还可以再改进,不是用内积直接得到元素值,而是还要加上两个常数因素
b1&b2,b1表示某人有多喜欢看电影,b2表示某电影有多么有吸引力让人去看,这些都是与两者属性无关的latent factor潜在因素。后续的minimize式子也再加上(+ b _ {i} + b _ {j}),甚至可以再加上正则式。
- 对上述模型还可以再改进,不是用内积直接得到元素值,而是还要加上两个常数因素
-
MF在topic analysis话题分析中的应用:MF矩阵分析在此称之为latent semantic analysis LSA潜在语义分析,矩阵值是term frequency词频,把词频乘上一个权重说明词的重要性。-
评价某词的重要性的常用方法是
inverse document frequency反文档频率,意思是计算每个词汇在整个paper有多少比率的文档算涵盖该词汇,如果说某词汇每个文档都涵盖则说明它的反文档频率很小重要性很低,而若只有某篇文档有则反文档频率很大十分重要。 -
话题分析的方法十分多,基本思想是差不多的(但有很多种变化)。常见的是
probability latent semantic analysis PLSA概率潜在语义分析和latent Dirchlet allocation LDA潜在狄利克雷分配。
-
-
第十八章 无监督学习 - word embedding词嵌入
-
word embedding词嵌入是降维的一个应用。如果不使用词嵌入降维,那么一般是将词进行one-hot编码(1-of-N Encoding)。如果不同word的数量较多那么得到的维数过多并且存在很多冗余(eg. 只有一个维度是1其他都是0,每个维度代表一个词)- 有一种方法是
word class,即把不同的word但同样性质分成同一个class,但是这样会使特征少了信息,比如class1是动物,class2是动物行为,这之间的关联用class是没有办法表达出来,所以需要词嵌入。
- 有一种方法是
-
word Embbedding同样也是将word映射到高维空间,但是远比one-hot维度要低。映射结果是类似同一个语义的词汇,在空间上距离接近,并且每个维度都有自己独特含义。整个问题是一个无监督学习问题,我们要做的是学习一个神经网络找一个function,输入是词汇,输出的对应的词嵌入编码。-
之前讲过auto-encoder自编码器(基于深度学习的降维方法)对此并不适用。
-
基本思想是模型输入文本,根据词的上下文内容,来推导各词汇之间的联系。
-
-
词嵌入就该思想有两种不同的做法:
-
一是
count based基于计数,如现在两词汇(w _ {i},w _ {j}),如果他们常在同一文章中出现,那么他们的向量距离会比较接近,其中代表性的例子是Glove vector手套向量。- 做法原则与
MF类似,(N _ {i,j})是(w _ {i},w _ {j})在同一文档出现的次数,有(N _ {i,j} ≈ w _ {i} * w _ {j}),最小化误差即可。
- 做法原则与
-
二是
prediction based基于预测,具体步骤是先学习一个神经网络,每个word可以用one-hot表示成一个特征向量,模型输入的是(w _ {i-1})的独特编码,输出下个(相邻)(w _ {i})是某个word的概率(输入输出维度相同)。-
在这种方式下对
hidden layer隐藏层就需要进行区别的设计,比如周深开演唱会和周杰伦开演唱会不同的(w _ {i-1})需要输出相同概率最大的(w - {i})。 -
使用(w _ {i-1})去预测(w - {i})比较困难,所以推广到希望前
n个word去预测下个概率。但是中间隐藏层的参数权重必须一样,因为如果不这样把同一个word放在两个不同的位置上得到的embedding就会不同,另外这样可以减少参数两不会随着输入的内容变多参数也变多。 -
如果让权重(omega)一样,只需在迭代更新时让(omega _ {i})对
cost function的偏微分减去(omega _ {j})对cost function的偏微分,(omega _ {j})对cost function的偏微分减去(omega _ {i})对cost function的偏微分,这样所有权重更新都一样了。 -
这个神经网络的训练只需要收集一大堆文字数据然后就可以了。除此外,基于预测的模型还有很多种变式,一种叫做
continuous bag of word model CBOW单词模型的连续袋,意思是拿某些词的内容去预测中间词汇(即(w _ {i-1},w _ {i+1})去预测(w _ {i}))。整个神经网络实际上不是deep的,就只是一个单线性层网络。
-
-
-
word vector词向量还有些有趣的特性:-
比如把城市名或者动词的三态放在一起,之间会有某种固定的关系。eg. V(hotter) - V(hot) ≈ V(bigger) - V(big),V(king - queen) ≈ V(uncle) - V(aunt)等
-
Multi-lingual Embedding 多语言嵌入:中文向量和英文向量映射,两边各自的特征空间,接下来如果有新的中文 / 英文词汇,可以直接投影到同一个空间上,再做两个空间的映射,这样就可以做翻译。
-
Multi-domain Embedding 多域嵌入:词嵌入不限对文字,还可以对影像嵌入。类似于输入
image,网络学习后输出跟词向量一样维度的向量,然后跟词向量一样进行之前的操作,最后得到可能训练集中没有class或者名称。
-
-
Document Embedding 文档嵌入:不仅是
word可以转换为vector,对document文档也行。最简单的方法就是把文档变成一个bag-of-word词袋,然后用自编码器学习出document semantic embedding文档的语义嵌入。- 光用词袋描述一个文档不够,因为词汇的顺序对语义也很重要,词袋只是知道词频跟词量。
第十九章 无监督学习 - Neighbor Embedding 近邻嵌入
-
TSNE是一种数据可视化工具,也是一种能将高维数据降至2-3维的算法,其中的T是指T分布,SHE是随机近邻嵌入,是一种非线性降维算法。-
数据点在高维空间可能只是一个
manifold流形,也就是说数据点的分布其实在低维空间,强行扭曲放置在高维空间里。manifold常举得例子是地球,地球表面是一个manifold(实际上是一个二维平面,被塞到了一个三维空间里面)。 -
在
manifold里只有距离很近的点,Euclidean distance欧氏距离才会成立,如果距离较远则欧式三角形不一定成立(是曲面了)。也就是说在高维空间我们计算相似程度不能使用欧氏距离比较。 -
所以
manifold learning要做的事情就是把高维空间形成的曲面展开放到低维空间摊平,摊平后我们就可以来计算欧氏距离了,这样降维对监督学习是很有帮助的。
-
-
Locally Linear Embedding LLE局部线性嵌入:-
一种摊平的方法是
LLE。首先在高维空间中有点(x^{i})和其近邻们(x^{j}),他们之间的假设线性关系(x^{i}=Σw _ {ij}x^{j}),那么w权重是由minimization最小化((x^{i} - Σw _ {ij}x^{j}) _ {L2-Norm})第二范式得到。接下来做降维,把(x^{i,j})转换成(z^{i,j}),中间关系w不变。 -
所以
LLE就是把(x^{i,j})在高维空间上固定住,之后为每一个(x^{i,j})找对应的(z^{i,j}),我们找的(z^{i,j})可以minimize上述范式。我们最小化做梯度下降可以得到w,(x^{i,j})也是已知的,(z^{i,j})是需要我们去找的,但是并没有一个明确的function来确定如何找到这样的z,需要凭空自己找,近邻数也是超参设定。 -
近邻数需要设置的不大不小,如果近邻过大就会考虑较远的点,那么欧氏距离就会失效。
-
-
Laplacian Eigenmaps拉普拉斯特征映射-
另一种摊平的方法是拉普拉斯特征映射。之前在半监督学习中提过
smoothness assumption平滑度假设,表示如果想比较两红点之间的距离用欧氏距离不够,需要表示高密度分布才表示两点距离近。可以把数据点转换成图形式,然后考虑smoothness -
在半监督时用
high density region高密度区域表示有label和无label的标签近似一样,而现在也是表示两者标签相近,之前的权重w表示相似程度,如果(x^{i,j})相近的话w就是一个很大的值,。(此处的x和y表示同一个东西,就是数据点)-
(L=ΣC(y^{r},hat{y}^{r})+lambda S)
-
(S=frac{1}{2}Σw_ {i,j}(y^{i}-y{}j)^{2}=y^{T}Ly)
-
-
(x^{i,j})与(z^{i,j})关系一致,那么需要找个(z^{i,j})
minimize S的值。对z加上约束条件:对z降维后能刚好分布在M维空间中,不会分布在更小的维度里。解出上式后得到,z就是图拉普拉斯算子的特征向量。
-
-
T-distributed Stochastic Neighbor Embedding t-SNE T-分布随机近邻嵌入
-
之前的方法只是假设了相近的点应该时接近的,而没有假设不相近的点要分开,即不同
class的点可以重叠在一起。 -
t-SNE同样也是降维,把数据点
x编程低维向量z。在高维空间上计算所有pair点对(x^{i,j})之间的similarit相似度。先对所有相似度做一个归一化,把其变成概率(全部加起来等于1,值介于0-1)。- (P(x^{j}|x^{i})=frac{S(x^{i,j})}{ΣS(x^{i,k})}),同理
z也进行normlization归一化。
- (P(x^{j}|x^{i})=frac{S(x^{i,j})}{ΣS(x^{i,k})}),同理
-
我们希望找出
z,让这两边分布越接近越好。可以用KL距离来量化两分布之间的相似度,要做的就是使L最小越好(梯度下降):(L=ΣKL(P( * |x^{i})||Q( * |z^{i}))=ΣΣP(x^{j}|x^{i})logfrac{P(x^{j}|x^{i})}{Q(z^{j}|z^{i})}) -
t-SHE一个缺点就是他会计算所有数据点的相似度,所以运算量很大。一般常见的做法是先进行PCA降维,降到大概低比如50维再用t-SNE降到2维。另一个是t-SNE不能进行实时计算,如果后续有新加数据必须得重新跑一遍算法。 -
在
t-SHE中相似度的选择非常巧妙,它选择的是符合t分布中的一种:(S(z^{i,j})=frac{1}{1+(z^{i}-z^{j}) _ {2-normal}})(在SHE和之前的相似度选择中都是用欧式距离取负号再取exp)
-
第二十章 无监督学习 - auto-encoder 自编码器
-
自动编码器:输入
digit向量,输出code(类似压缩效果,code是一种image compact representation图像紧凑表示)由于要做的是无监督学习,可以再搭建一个decoder解码器,把两个网络连接起来一起训练。-
类似于之前的PCA,PCA中是
input(x),output(hat{x}),中间的component weight构件权重就是隐藏层(PCA中是线性的),(x * w = c,c * w^{T}=hat{x}),这层hidden layer隐藏层输出就是(c),这层layer通常称为Bottleneck later(不知道有什么好的译文称呼)。 (w)就相当于将(x)编码成(c),(w^{T})将(c)解码成(hat{x})。 -
Bottleneck later叫法是因为component数目通常比input维数小得多(因为在做降维),如果要把它当作一层看就是一个特别窄的layer。 -
在PCA中只有一层,而在自编码器里可以设置很多层,在中间会有一层特别窄有非常少的
neural,我们把这层称之boottle layer。从input到boottle layer是encoder降维,从boottle layer到output是decoder升维重建。 -
深度自编码器比
PCA的效果要好不少,降维再重建后得到的图像较原图像区别不大。
-
-
自编码器 - 文本检索:
-
自编码器在文本处理上可以把
document压缩成一个code。在文本检索中有一种文本检索的方法叫:vector space model向量空间模型。其是把document表示成一个空间的向量(经过了降维),然后需要检索的单词表示成空间中的点,计算单词与每篇document之间的inner product内积,选择相似程度较高的。这种方法是否有效,取决于document是否很好能降维成向量。 -
用一种方法是
Bag-of-word词袋,意思是向量的sentence就是let think sentence(假设世界上有1w个词汇,那么这个向量的sentence就是1w维)。甚至你可以将其乘上weight表示词汇的重要性。但是这种方法没办法考虑semantics语义。所以这时候就可以用Auto-encoder自编码器,输入document or query,通过自编码器压缩成二维,每个点表示一个document,不同的颜色的类代表document属于哪类。再做检索时输入的单词通过自编码器映射到哪一类上,就可以把相关的文本检索出来。如果用Latent Semantic Analysis LSA隐语义分析是得不到类似的效果。
-
-
自编码器 - 类似图像搜索:
- 图像检索可以计算
input与其他pixel的相似程度,找出最像的图像,但这样的结果实际上并不好。因此可以用自编码器把image转成一个code再在此上算相似度做检索。(因为这是无监督的,数据量大)
- 图像检索可以计算
-
自编码器也可以用在
Pre-training预训练上,预训练是用来找到神经网络比较合适的初始化参数。-
比如训练网络输入
784维,中间第一层1000维,第二层1000维,第三层500,输出10维。 -
那么我们可以首先训练一个深度自编码器,
input and output都是784维,中间code是1000维,这样得到第一层的w权重;再继续训练input and output都是1000维,中间code是500维,得到第二层的w权重,以此类推,最后得到各层的初始化参数,最后再用反向传播调整一遍,这个步骤称为find-tune(迁移学习的一种手段)。 -
当网络的
coder要比输入dimension小,如果比之大的话可能不会learn。当发现hidden layer比input大时就需要加上一个很强的regularization L1正则项加在层输出上。
-
-
还有种方法能让自编码器效果更好,叫做
De-noising Auto-encoder去噪自编码器,即主动在原来的input上加上一些noise噪声变成(x‘)后再进行自编码,要求output与原input误差越小越好。这样使模型在学习时把噪声过滤掉了。 -
还有一种方法叫做
contractive auto-encoder压缩自编码器,即在学习code时加上一个contract压缩,表示当input有变化的时候,对code的影响是被minimize最小的。与之前的去噪自编码器实际类似,制式不同角度来看,降低变化对code的影响。 -
CNN自编码器:-
CNN而言将卷积和池化层交替,让image越来越小。对编码器而言就是做相同的事,解码器就是做相反的事。convolution pooling convolution pooling & deconvolution unpooling deconvolution unpooling,让输入和输出越接近越好。 -
反池化操作:
pooling是把原矩阵分组缩小,unpooling就是把小的矩阵扩大。相应的位置对称操作,把小的矩阵做扩散,部分地方补0.(并非唯一做法,在keras种是重复某些值) -
反卷积操作:反卷积实际上就是卷积。只不过是把维度还原成原先的维度,不同的是权重是相反的(转置)。
-
-
除了
CNN自编码器,后续在介绍到RNN时还会讲到sequence-to-sequence auto-encoder序列到序列编码器,针对于语音和文章等不好表示成向量的数据结构。(如果用bag-of-word词袋强行表示成向量的话会失去语义以及前后上下文关系)
第二十一章 无监督学习 - 深度生成模型Ⅰ
-
deep generation model深度生成模型,目的是通过输入图像训练从而输出图像的一个大型神经网络,属于无监督学习的一个分支。这个分支希望的是机器不仅能进行辨识,更重要的是能够画出一只猫或者狗,通晓其概念。这个分支内大概分为三个方法:PixelRNN,VAE,GAN(像素循环神经网络,变分编码器,生成对抗网络) -
PixelRNN像素循环神经网络:-
RNN是专门处理序列数据,即可处理可变输入。(相当于少的地方补了
0)。pixelrnn的工作方式是首先随机涂一个像素,然后输出下一个像素点。(实际上就是RGB三维向量)之后再输入这两个像素输出下一个像素,循环直至结束。属于无监督,不需要任何标签,并且其产生的图最为清晰。 -
pixelRNN生成模型练习:输入pixel时换了一种表示方法用1-of-N-encoding独热码对像素颜色编码产生n维向量,颜色过大再用聚类合并最后得到176种不同颜色。(因为如果用RGB三维向量表示无法使某个值很高,产生的图都比较灰颜色不鲜明)- 网络架构只用了一层
LSTM还有521cells
- 网络架构只用了一层
-
-
variational auto-encoder VAE变分自动编码器-
深度生成模型的目的就是不确定随机输入后输出图像等。自编码器种的解码器部分就可以做到这样的功能,先训练完自编码器,然后将解码器单独拿出来
input随机向量(与code同维),输出的可以是一张完整的图像。 -
显然这么做性能不好,所以我们将其改进,中间部分加一些
trick,模型称之为variational auto-encoder VAE变分自编码器。在原encoder编码器部分改进output,不直接输出code,而是先输出两个与code同维向量((m1,sigma)),并用正态分布生成同维向量(e),对三者进行组合得到code为(c=exp(sigma) * e+m)之后minmize reconstruction error最小化重建误差。除此之外还需要最小化(Σ(1+sigma-(m)^{2}-exp(sigma)) -
VAE得到的图像不是很清楚,但是相比PixelRNN不同的是,VAE可以control控制(在维度上拉伸,就可以发现每个维度的相对含义)生成的图像。
-
第二十二章 无监督学习 - 深度生成模型Ⅱ
-
VAE续:-
对于之前自编码器而言,假设满月图为
code空间上一个点,半月图也为一个点,如果想要得到中间样子的图,没有办法从两者之间取样,因为编码器和解码器都是非线性的,中间样子的图并非是在其线性关系上。 -
而对于
VAE而言,可以在c处加上一个noise,满月图往半月图方向加noise,半月图往满月图方向加noise,那么对于该点而言,它既被希望往满月图重建,又被希望往半月图重建,VAE训练要minimize mean square最小均方,那么最后产生的就是一张介于满月和半月之间的图。所以在VAE上code space采样会得到中间图而在自编码器上得不到。 -
所以对
VAE中的值有了解释:(m)代表原来的code,(c)代表加上noise以后的code,(sigma)代表noise的variance方差,(e)代表正态分布采样值。其中variance是模型自己学习得到的(从encoder产生)。 -
对
variance而言必须加上限制,不能让它太小,如果让模型自己决定那肯定就是0(没有方差肯定最好),所以新加的最小化(Σ(1+sigma-(m)^{2}-exp(sigma))就是对其做的限制。前部分是对variance做约束,后部分类似加了L2-Norm作正则化。
-
-
上述是直观理由,后面是正式理由:
-
我们可以把每张图看作是高维空间的一个数据点,要做的就是估计高维空间上的概率分布
P(x)。只要得到概率分布就能根据去采样图像,找出来的图就会接近我们需要的图像。 -
如何去估计概率分布,我们可以用
gaussion mixture model高斯混合模型:我们现在有个分布,这个分布是由很多高斯分布用不同w权重叠合起来的,如果高斯分布越多,就可以产生很复杂的该分布,公式为(p(x)=Σp(m)p(x|m))。如果我们想要从(p(x))采样,先要决定要从哪一个高斯分布中采样,每个高斯分布都有自己的权重和((μ,Σ)),根据各权重去决定你要从哪个高斯分布中采样数据,所以有了上式。 -
每个
x都是某一子分布中被采样出来的,这件事类似分类,但他也不是完全,因为data做聚类是不够的,更好的方式是distributed representation分布式表示,即不属于任何一个class,而是用一个vector来描述各个不同方向的特性。可以说VAE是gaussion mixture model的distributed representation版本。 -
首先要从正态分布采样假设
z(意思是可以映射到所有的高斯分布),向量z的每个维度都代表了某种属性,带入一个function产生其对应的(N(μ,sigma))。我们可以训练一个神经网络来作为这个function。然后对P(x)来说有(P(x)=int {P(z)P(x|z)dz})。知道了z是什么就可以决定x是从怎样的((μ,Σ))function里被采样出来的。((μ,Σ))的关系等式是maximizing the likelihood最大化可能性。 -
即输入数据集
data_x希望找一组((μ,Σ))function,它可以让p(x)取log后相加是被maximizing。所以我们要做的就是调整NN里面的参数使得likehood可以被最大化。(L=ΣlogP(x)) -
另外引入一个分布叫做(q(z|x)),也就是我们有另外一个(NN^{T}),
input一个x它会返回对应z的((μ',sigma'))。之前的NN就是VAE里面的解码器,另一个(NN^{T})是VAE的编码器。(x->z->分布) -
归纳到一起就是:(logP(x)=int{q(z|x)logP(x)}dz),(q(z|x))是一个分布,对此积分与(P(x))无关可以提出来,可以得到(logP(x)=int{q(z|x)log(frac{P(z,x)}{q(z|x)})}dz + int{q(z|x)log(frac{q(z|x)}{P(z|x)})}dz),左边部分表示的是
KL divergence距离代表的是两个分布相近的程度,一定是大于等于0的,所以L=logP(x)一定会大于左边项,这项为lower bounud下界,称之为(L _ {b}) -
我们要最大化
L(L就是likehood)。在(L _ {b})中,p(z)是已知的,不知道的是p(x|z)。我们最开始是要找(P(x|z))和(q(z|x))让这个likehood越大越好,现在做的事找到这两个让(L _ {b})越大越好。刚才的等式就说明了两者是正相关,正好满足了需求:(likehood=L _ {b}+KL)。我们固定(p(x|z))去调整(q(z|x)),(L _ {b})变大(KL)变小(likehood)变大。(KL)变小就说明(P(x|z))近似于(q(z|x))。 -
最小化
KL,就是去调q对应的NN产生的分布跟正态分布越接近越好。所以整个case就变成说input一个x然后产生两个向量,产生一个z,再根据这个z产生另外一个向量跟原来的x越接近越好。这件事实际上就是自编码器,只要input&output越接近越好,所以两项合起来就是之前说的VAE的损失函数:(Σ(1+sigma-(m)^{2}-exp(sigma))
-
-
还有一种
conditional VAE。如果要应用产生手写数字,就给它digit然后把数字的特性抽取出来(笔画粗细等),然后放进编码器的时候一方面给他关于数字特性的分布,另一方面告诉解码器是什么数字。这样就可以根据数据集生成跟它风格相近的数字。 -
VAE的问题 :VAE的一个很严重的问题是:它学到的不是咋样产生一张看起来像真的图像,而是产生一张与数据集里某张相似的图像。它并不知道评估它产生的图像跟数据集图相似度的时候(MSE等),解码器的输出跟真正图像之间有一个像素的差距也会使得结果非常不一样。但对VAE来说这仅是一个像素点的差距,两者没什么差别。所以接下来就引入了GAN
-
Generative Adversarial Network GAN对抗生成网络:-
GAN的概念类似拟态的演化:有一个生成器生成图像,有一个Discriminator鉴别器去鉴别图像。生成器生成图像,鉴别器输入生成器生成图像与real images真实图像调整模型参数进行判断:是真实的还是生成的。之后生成器再根据鉴别器的结果调整它的参数(比第一次生成更接近真实图像)生成图像,再鉴别器继续根据生成图像与真实图像进行判别。(后一代生成器可以骗过前一代的鉴别器,两者都在演化) -
生成器从来没有接触过真实图像,鉴别器一直都在接触真实图像。生成器的目的就是要骗过鉴别器,鉴别器的目的就是要鉴别出生成图像。
GAN鉴别器就是一个神经网络, 输入是一张图像,输出是0-1概率判别真实图像和生成图像,GAN生成器也是一个神经网络,架构跟自编码器中的截脉气一样,输入是一个分布中采样出来的向量,输出是图像。鉴别器中生成图像的label是0,真实图像的label是1。 -
GAN把生成器跟鉴别器组合在一起,构成一个大型的神经网络。训练生成器时,输入向量做梯度下降,希望网络最后输出接近1,只更新生成器部分参数,fix固定鉴别器部分参数。 -
GAN paper中的Toy example:z是个一维向量,输入生成器里,会产生另一个一维的输出x(z可以是从任何分布采样的),每个不同的z会得到不同的x,之后把z和真实数据输入鉴别器,目标就是希望生成器的输出与real data越接近越好。问题是无法判断进行学习的结果是否work,比如当分类器的效果不好的时候,可能是因为生成器效果非常好生成图像与真实图像相近,也可能是鉴别器能力太弱了 - 因为从生成器鉴别器的loss没办法看出来效果如何,只能更新一次人工看一次,方向错了再进行更新,这还是一个没有解决的难题。 -
在GAN中最大的问题是没有一个明确的
signal,要做的事是保持生成器和鉴别器是well-matched,不断处于竞争状态,这需要一个很困难的平衡来调整参数。当鉴别器失败,平衡破除时,并不代表说GAN成功了,往往是此时的鉴别器太弱了,且生成器也并未多强。
-
第二十一章 迁移学习
-
迁移学习是指:我们能否利用一些不直接相关地数据来帮助我们要做的
task- 不直接相关有很多种可能,比如输入分布类似(同样是动物),但是标签不同(task不同);输入维度不同,但是task相同(都是猫狗分类)。-
迁移学习的原因是因为任务数据集过少,但是类似数据集很多,比如泰文语音过少,但是中文英文语音很多。
-
下述术语可能会和别的地方有些不同。
-
将数据集分为四种:
Target Data & Source Data + labelled & unlabeled
-
-
Model Fine - tuning:假设目标数据和其他数据同时具有标签,最常见做的事就是fine-tuning模型微调。-
target data量很少而source data很多,这种叫做one-shot learning单样本学习,这样的task最典型的例子的是speaker adaption。这种方法遇到的挑战是target data可能很少很少,会导致模型过拟合overfitting。 -
conservative training:对上述情况还有一个技巧是保守训练,即如果有大量source data要拿来做神经网络,如果目的数据集过少直接训练则会使模型坏掉,我们可以在训练的时候加一些constraint(regularization),让新模型跟旧模型不会差太多,希望两者的L2-Norm差距越小越好。(正则化防止过拟合) -
layer transfer:还有一种方法使层迁移。先用source data训练好一个模型,然后把该模型的几层拿出来拷贝到新模型里面,然后再用target data去训练剩下的没有拷贝的层,这样的好处使目的数据集只需要考虑很少的参数,这可以避免过拟合的情况(数据集少模型复杂,降低模型复杂度)。(如果目的集足够多了还是需要用Model Fine模型微调)- 哪些层应该被迁移 - 不同的任务需要被迁移的层往往是不一样的,在语音识别上通常是迁移最后几层训练前面层,在图片识别上通常是迁移前面层训练最后几层,根据模型对应层做的工作决定。
-
-
多任务学习:多任务学习跟
fine tuning不同,fine tuning只关注目的数据集的表现,而多任务学习是需要同时关注两者的共同表现。深度学习特别适合来做多任务学习,因为这样的好处是taskA和taskB在前面几层是可以公用的,这样会有比较多的数据都得到比较好的性能(前提是有没有共通性)、-
还有一种是当
input没办法确定时,不同task的输出都用不同的神经网络迁移到同一个维度上,然后在中间如果可以有共享的层就共同经过,再应用不同的网络分开。 -
eg. 多语言的语音识别,输入不同的语言,前面层共享参数,后面层各不同参数;中翻英,中翻日也同样是可以贡献前面层不同后面层。
-
迁移学习的负面效果是有可能的,数据任务间能不能迁移取决于
task与data的相似程度。 -
progressive neural networks:对于迁移学习的判断很浪费时间,这就是出现了渐近神经网络。意思是先训练好taskA,之后固定住其参数训练taskB,对B而言每层都会接受taskA某层的参数,对taskC同理。这样的好处是后者不会影响前者,后者借用前者参数的同时可以改变参数(相当于副本),这样也不会影响自身性能。
-
-
假设目的数据集是
unlabel,而source data是label的:-
一般来说如果两者数据集相近相同
task通常来说是把source data视作training data,target data视作testing data。这样产生的问题是训练集和测试集是非常不匹配的。 -
因为神经网络前面层一般当作是特征提取,后面层当作分类;当训练集结束后输入测试集,由于不同
domain data领域数据特征完全不同,所以不能够直接这样做(也相当于是说两边的数据集不属于同一分布,这样的话测试结果肯定是不合理的)。 -
Domain-adversarial training:我们希望模型能够把domain领域特性去除,因此我们使用领域对抗训练,也就要让特征提取把不同领域的混在一起而不单独列出。意思是它相当于把模型分为了三部分,特征提取 + 领域分类 + 预测器。着重是前两部分。前两部分类似于GAN中的编码器与解码器,而label predictor预测器与领域分类器并列接受特征提取的输出。-
相当于就是说特征提取的输出要骗过领域分类器,并且要让
label predictor结果很好。特征提取器想要骗过领域分类器只需要加一个gradient reversal layer梯度反转层即可,也就在做反向传播的时候特征提取器把反向接受领域分类器的值乘上负号(也就是领域分类器告诉你要怎么做你就偏偏反着做) -
如今对于该方法的问题就在于领域分类器使用什么方法来鉴别得到的特征是属于哪个领域(一些比较新的
paper在做这样的事)
-
-
zero-shot-learning:对比领域对抗训练,零样本学习定义更加苛刻,它可适用于目的数据集与其他数据集的task是不一样的。(刚才任务都是分类0-9)。(零样本意思是没有目标训练集)-
零样本学习需要的是一个背后数据库,里面会有所有训练集测试集可能出现的
class和它对应模型的输出(键值对,相当于说输出后去数据库查),训练集学习模型后输出的不直接是class而是属性(比如音标,比如动物属性,植物属性),这样即使测试集里面有未知的也可以通过输出的属性去数据库中查找(最接近)。 -
当属性复杂的时候可以做
attribute embedding属性嵌入 ,也就是把输入和输出都映射在同一个embedding space嵌入空间上,中间映射函数f(*) & g(*)可以是神经网络,该网络目的是找到一个f&g使得图像跟属性在某维嵌入空间距离越近越好,并且要跟其他的距离越大越好,测试时就可以根据属性在空间上分布得到图像分布从而确定图像label。 -
如果没有背后数据库或者不知道每个输入的属性,则可以借用
word vector词向量表示,再去做嵌入就可以了。(f * ,g * = argminΣmax(0,k-f(x^{n}) * g(y^{n})+maxf(x^{n}) * g(y^{n}))),loss最小是0,当(Zero loss:f(x^{n}) * g(y^{n}) - maxf(x^{n}) * g(y^{m}) > k)时。 -
还有一种简单的零样本学习方法叫做
convex combination of semantic embedding凸组合语义嵌入。意思是有一个现有的识别网络和词向量库,把目的数据输入训练让其输出识别概率,然后根据识别概率按比例混合词向量得到新的向量,在词向量库中进行比较找到最接近的词向量得到label。
-
-
-
target data有标签,source data没有标签的叫做self-taught learning自我学习;两者都没有标签的叫做self-taught clustering自我聚类。-
学习从
source data中提取更好的表示 -
为目标数据提取更好的表示
-
第二十二章 Supprot Vector Machine支持向量机
-
SVM两个特色,一是hinge loss,二是kernel trick,两者相加就是SVM -
一般来说机器学习的三个步骤:
-
step1. Function set(Model)
-
step2. Loss function
-
step3. Training by gradient descent
-
-
对于二分类问题,我们对于损失函数的选择是希望当(hat{y}=+1)时,f(x)越正越好;(hat{y}=-1)时,f(x)越负越好,即(hat{y}f(x))越大损失函数应该越小,相反越小损失函数越大越好。
-
对于
Square Loss平均损失:(l(f(x^{n}),hat{y}^{n})=(hat{y}^{n}f(x)-1)^{2}),当(hat{y}f(x))越大时损失函数会很大,不合理。 -
对于
Sigmoid+Square loss:(l(f(x^{n}),hat{y}^{n})=(sigma(hat{y}^{n}f(x))-1)^{2}),在正数范围时表现很好,但是在负数范围时损失函数不超过1,梯度很小收敛很慢,不合理。 -
对于
Sigmoid+cross entropy交叉熵:(l(f(x^{n}),hat{y}^{n})=ln(1+exp(-hat{y}^{n}f(x)))),正负数范围内都表现很好,越负梯度越大迭代速度很快,逻辑回归使用此作为损失函数。 -
对于
ideal Loss:(l(f(x^{n}),hat{y}^{n})=frac{l(f(x^{n}),hat{y}^{n})=ln(1+exp(-hat{y}^{n}f(x)))}{ln2}) -
对于
hinge Loss(折页 / 铰链损失函数):(l(f(x^{n}),hat{y}^{n})=max(0, 1-hat{y}^{n}f(x))),在(hat{y}^{n}f(x))未超过1时会一直有penalty惩罚项让它超过1这样就足够好了,没有必要让其持续变大。其好处是少产生Outliers离群值,学习出的结果比较鲁棒。支持向量机使用此作为损失函数。
-
-
Linear SVM线性支持向量机:-
线性表示
Function(Model)使用的是线性函数:(f(x)=Σwx+b=egin{bmatrix} w&x \ b& 1end{bmatrix}=w^{T}x)。也可以不用Linear版本的,用deep version的SVM。 -
损失函数使用
hinge Loss加上正则项,两者都是凸函数合一起仍然是凸函数可以使用梯度下降做优化器(梯度下降推导过程省略)。 -
线性
SVM另一种表述:使用(varepsilon ^{n})取代等于hinge Loss得到$varepsilon ^{n}geq 0,1-hat{y}^{n}f(x) (,变形为)hat{y}^{n}f(x)geq 1-varepsilon ^{n}(。这是常见的`SVM`约束,)varepsilon ^{n}$是slack variable松弛因子(不能是负的否则就不是松弛了)。这是Quadradic programming problem二次规划问题,可带入QP solver或者梯度下降求解(就是上一种表述)。
-
-
核方法:
-
Dual Representation对偶性:把权重参数w表示成数据点的linear combination线性组合(w=Σalpha x),在队损失函数的梯度下降更新中假设(c(w))是损失函数对(f(x))的偏导数,若是hinge loss则(c(w))往往是0,则不是所有的(x)都会被求和,从而$alpha $可能是稀疏的,这样就算有些数据点只要不是支持向量的去掉也不会对模型造成造成影响(异常点),模型比较鲁棒。相比逻辑回归每个数据都对结果会产生影响。 -
把
w写成x的线性组合(对偶性),最大的好处是可以使用核技巧。 -
Step1:$ f(x)=w{T}x=alpha{T}X^{T}x=Σa _ {n}(x^{n} cdot x) (,把内积)x^{n} cdot x(写作核函数)K(x^{n} cdot x)(,这样假设函数就可以写成)f(x)=Σa _ {n}K(x^{n} cdot x)$,这样我们只需要知道核函数
K即可(线性核)。 -
Step2:(L(f)=Σl( f(x^{n}),hat{y}^{n} )=Σl( Σa _ {n}K(x^{n'},x^{n}) )),将损失函数转化为上式(K(x,z)),即找到一组([alpha1,...,alpha N])使得损失函数最小。这样的好处是不需要知道
x,只需要知道x和z的内积。这就是去使用核技巧第二步,核方法不仅适用于SVM。 -
核方法是一类把低维空间的非线性可分问题转化为高维空间的线性可分问题方法,理论基础是
Cover's theorem,(phi (x))就表示(x)映射后的线性向量,去做特征转换的结果,将k维投影到更高维,每个维度考虑所有特征两两之间的关系。(K(x,z)=phi (x) cdot phi (z)= egin{bmatrix} {x _ {1}}^{2} \ {x _ {2}}^{2} \ sqrt{2}{x _ {1}}{x _ {2}} end{bmatrix} cdot egin{bmatrix}{z _ {1}}^{2} \ {z _ {2}}^{2} \ sqrt{2}{z _ {1}}{z _ {2}} end{bmatrix}),这样就只需要计算(phi (x))积即可。
-
-
核技巧:
-
K就是核函数,即输入两个向量,返回的值跟两个向量分别作(phi (x))映射然后点积的结果相同。核方法是计算两个(phi (x)),核技巧是利用核函数直接计算(<phi (x),phi (z)>),从而加速核方法计算的技巧。SVM的表现形式包含了映射的点积,所以可以用核技巧加速核方法的计算。 -
常用的核函数:
-
RBF kernel径向基核函数:x与z越像则K(x,z)越大,是两个无穷特征向量的内积。将和函数展开使用泰勒级数可见是无穷项之和,每项写成内积形式得到两个无穷维的向量。由于使用无穷维的特征,在使用RBF核函数时小心过拟合overfitting。(K(x,z)=exp(-frac{1}{2}egin{Vmatrix} x end{Vmatrix}^{2} - frac{1}{2}egin{Vmatrix} z end{Vmatrix}^{2} + x cdot z)) -
sigmoid核:sigmoid kernel可视为单层网络,最后搞个tanh激活函数输出。(K(x,z)=tanh(eta X^{T}Z+ heta)) -
常用核函数:线性核,多项式核,高斯核,拉普拉斯核等
-
核方法的好处就是不需要去考虑
x和z,可以直接去设计核函数。
-
-
-
SVM其他变形:Support Vector Regression SVR用于预测回归,Ranking SVM,one-class SVM一分类支持向量用作异常检测。
第二十三章 Structured Learning 结构化学习 - 简介
-
结构化学习特点:输入输出都是一种带有结构的对象,对象包括
sequence,list,tree,bounding box等等。 -
听上去很困难,实际上有一个统一的框架。
-
Unified Framework统一框架:-
Training:另找一个F函数(与原model不同),输入x,y输出一个实数,函数的功能就是匹配输入输出x,y有多匹配,越匹配实数值越高。 -
Testing:给定一个新的x,穷举所有可能的y带入F中,看哪个能让实数值最大,此时的y就是最后的结果model的输出。(比如物体检测,边界框不断地挪动给分发生变化,它就知道往哪边是正确地方向,最后界定住检测物体)(y=arg maxF(x,y)) -
概率描述:
F看作是x,y的联合概率(即一起出现的几率),这样输入两者输出0-1的数,测试时就是计算所有的(P(y|x)),最高概率的y即是模型的输出。这种表达方式缺点在于其解释性有限,比如检索说查询值和结果共同出现的几率就不合理,几率值界定在0-1范围没必要;优点就是具有现象意义,比较容易描述现象。 -
Energe-based model EBM能量模型也就是一个结构化学习模型(统一框架)。
-
-
这个框架需要解决三个问题:
-
Evaluation:统一框架F(x,y)是一个什么模型,能够接受各式各样的数据 -
Inference:(y=arg maxF(x,y))怎么解决arg max问题,遍历所有可能值则规模太庞大。 -
Training:给定training data如何找到F(x,y)值,原则是希望预测结果的F(x,y‘)是该x对应的最大值。
- 这三个问题与
HMM隐马尔可夫模型三个问题,DNN深度神经网络联系到一起。例如手写数字识别可以先把x输入一个DNN得到N(x),然后把<y,N(x)>算交叉熵,取反交叉熵就得到F(x,y)(因为要求越大越好,交叉熵是越近越小)
-
第二十四章 结构化学习 - 线性模型
- 实现结构化学习就是实现上章所述三个问题。(模型,损失函数,优化)
-
假设
F是线性模型,则需要用一组特征来描述(x,y)对,假设为(phi (x,y)),F可写为(F(x,y)=W^{T} phi (x,y)),一般可以用CNN来做特征抽取得到(phi (x,y))。(因为人工提取很难描述精确) -
假设第二个问题被解决情况下先讨论第三个问题。即如何找到一个(W^{T})满足$w cdot phi (x,hat{y}) > w cdot phi (x,y) (。我们先随机生成权重`w`,在通过式子)w -> w+phi (x{r},hat{y}{r}) - phi (x{r}, ilde{y}{r})(来更新直至 `w`不再变化,此时我们便找到了所需的`w`。(其中)hat{y}{r}$是标签,$ ilde{y}{r}$是第二步找到的结果)
-
这个寻找
w的算法就是perceptron感知器算法。perceptron learning感知器学习也是结构化学习的一个特例 -
在下一章会又更详细的讲解。
-
证明算法的可行性和收敛性(省略)
-
第二十五章 结构化学习 - 结构化支持向量机
-
之前提及的三个问题:模型选择,如何解决
arg max,如何重建F(x,y)-
问题二之所有跳过是因为对于不同的
task,所使用的手段不一。如下: -
Object Detection-
Branch and Bound algorithm分支定界算法 -
Selective Search选择性搜寻
-
-
Sequence LabelingViterbi Algorithm维特比算法
-
The algorithms can depend on(phi(x,y)) -
Genetic Algorithm基因算法(遗传算法)
-
-
三个问题着重
focus on第三个问题。 -
假设
Separable case:存在一个w满足$w cdot phi (x,hat{y}) > w cdot phi (x,y) $。-
Structured Perceptron结构化感知机:这就是上一章描述的方法,先随机生成权重w,对于每个数据再通过式子(w -> w+phi (x^{r},hat{y}^{r}) - phi (x^{r}, ilde{y}^{r}))来更新直至w不再变化,此时我们便找到了所需的w。(其中(hat{y}^{r})是标签,( ilde{y}^{r})是第二步找到的最大结果) -
该方法的最多需要更新((R/ zeta )^{2})次就能找到
w的收敛值,$zeta (是`margin` 错误点与正确点向量差,)R(是)phi{x,y}(与所有)phi(x,y')$之间距离的最大值。(收敛次数与y空间规模无关) -
收敛证明(省略)
-
加快训练速度:从分子角度来说可以
Normalization;从分母角度来说可以Larger margin减少更新。
-
-
假设
Non-Separable case:假设数据集没有办法很好的找到需要的w,但是不同的w之间也能体现出好坏。-
因此可以定义一个
Cost Function代价函数来评估w从来通过最小化代价函数找到最优w。代价函数也可以自己定义,该处定义的是对于每个数据的代价函数(C^{n})而言,有(C^{n}=max[w cdot phi(x^{n},y)] - w cdot phi(x^{n},y^{n})),总的损失函数:(C=ΣC^{n})。 -
对该式进行随机梯度下降,梯度通过(argmax[w cdot phi(x^{n},y)] =w cdot phi (x^{r},y') - w cdot phi (x^{r}, ilde{y}^{r}))(每个
w落到不同的y区域而定(y')是哪个)可知(igtriangledown C^{n}=phi (x^{r},y') - phi (x^{r}, ilde{y}^{r})),所以更新$w -> w-eta igtriangledown C^{n} $。- 假设(eta =1)时,做的实际上就是结构化感知机;设置成其他的学习率,将会产生不同的模型
-
-
假设
Considering Errors:误差也可以分为不同的等级,训练数据的时候也需要考虑进去。-
我们可以定义
Error Function误差函数来确定正确标记与错误标记之间的差异。误差函数也是自定义的,图像上常见的误差函数定义为:(Delta(hat{y},y) = 1- frac{A(hat{y}) igcap A(y)} {A(hat{y}) igcup A(y)}),(A(y))表示边界框(y)的区域。 -
那么损失函数改为:(C^{n}=max[w cdot phi(x^{n},y)+Delta(hat{y},y)] - w cdot phi(x^{n},y^{n}))。同样对此进行求解梯度,也是通过
argmax得到,(igtriangledown C^{n})除了之前不同的是(y)取值不同(因为有误差函数的英雄)其他都是一样的。 -
最小化代价函数实际上是最小化训练集误差的上界,因为对于任何的数据集而言,误差函数可以是任何函数形式,所以我们通过证明(Delta(hat{y},y) leq C^{n})将最小化误差转换为最小化代价函数。
- 我们上述使用的代价函数是
Margin rescaling间隔调整,也可以使用Slack variable rescaling松弛变量调整作为代价函数。
- 我们上述使用的代价函数是
-
-
假设
Regularization正则化:在之前的代价函数基础上加上正则式-
(C=ΣC^{n} -> C=frac{1}{2}egin{Vmatrix}w end{Vmatrix}^{2}+lambda ΣC^{n})
-
梯度和
w的迭代公式也随之有变化
-
-
Structured SVM - intuition直觉解释:-
把(C)替换成(varepsilon ^{n})(
SVM中的松弛因子),将(C^{n})变形得到:对所有(y)有:-
(varepsilon ^{n} + w cdot phi(x^{n},hat{y}^{n}) geq w cdot phi(x^{n},y)+Delta(hat{y}^{n},y))
-
$ w cdot phi(x{n},hat{y}{n}) - w cdot phi(x^{n},y) geq Delta(hat{y}^{n},y) - varepsilon ^{n}$
-
(C=frac{1}{2}egin{Vmatrix}w end{Vmatrix}^{2}+lambda Σvarepsilon ^{n})
-
-
这里面
margine(就是(Delta),正确框与错误框之间的差值)减去(varepsilon),即为了放宽约束或限制,使得margine变小,但限制不应该过宽,否则失去意义,(varepsilon)越小越好,且要大于0(因为是松弛因子)- 对于上式②,每个
y^{n}都有这样的表达式,我们可能找不到一个w满足所有的不等式成立
- 对于上式②,每个
-
训练时我们希望求得
w满足训练集以上的不等式且(lambda Σvarepsilon ^{n})是最小的,同时加上对应的正则式也满足最小化。-
可以利用
SVM包中的solver来解决以上的问题 -
是一个
Quadratic Programming QP二次规划问题 -
约束条件过多,需要通过
Cutting Plane Algorithm切割平面算法解决受限的问题。
-
-
-
Structured SVM - Cutting Plane Algorithm切割平面算法:-
无约束条件的问题求解:假设我们先不考虑限制的部分,只考虑最小化部分,同时假设(w)只有一维,即(w)和(ε)为
0时,对应的值最小。 -
有约束条件的问题求解:虽然有很多的约束条件,但是其中有很多的约束都是冗元(冗余元素),并不影响问题的解决,只有范围的切定边界条件有影响 - 将其称之
Working Set有效集合。我先使用假定的一组有效集合(初始为空集合null,即没有任何约束),仅考虑作用集里面的y解决QP问题求出对应的w,再用w重新检查寻找新的约束元素加入集合中。不断地进行迭代直至求得的w不再变化。 -
我们使用
w寻找要加入的新约束条件violated违背求解QP结果最严重的约束(即是当前最难搞定的约束)。直到所有难搞定的线条都要加入后区间内的pooint就是问题的解。约束条件是(w cdot phi(x^{n},hat{y}^{n}) - w cdot phi(x^{n},y) geq Delta(hat{y}^{n},y) - varepsilon ^{n}),违背最严重即是(w' cdot phi(x^{n},hat{y}^{n}) - w' cdot phi(x^{n},y) < Delta(hat{y}^{n},y) - varepsilon' ^{n}),将其转化为(argmax[Delta(hat{n},y) + w cdot phi(x,y)]),求解得到就是违背最严重的约束。
-
-
多类别支持向量机:
-
Q1. 模型:(F(x,y)=w cdot phi(x,y)),假设存在
k类,w矩阵有k个权值向量。 -
Q2. 推理:穷举所有的
y,使得(F(x,y))最大化,这里的类通常数量很少,不像边界框,所以可以穷举。 -
Q3. 训练:求解(w, varepsilon^{1}..., varepsilon^{n}),最小化(C)
- 对任意
n有(n(k-1))个约束
- 对任意
-
-
二元支持向量机:
-
Q3. 训练:((w^{hat{y}^{n}} - w^{y}) cdot x gep Delta(hat{y}^{n},y) - varepsilon^{n})
-
如果(hat{y}^{n}=1),(w^{1}-w^{2} -> w),则转为:(w cdot x gep 1-varepsilon^{n})
-
如果(hat{y}^{n}=2),(w^{1}-w^{2} -> w),则转为:(-w cdot x gep 1-varepsilon^{n})
-
-
用结构化
SVM概率联想二元SVM分类问题。
-
-
下一步支持向量机:
-
结构化
SVM的模型是线性结构,如果想要结构化SVM的扩展性更好则需要定义更好的特征,较好的方法就是利用深度神经网络来生成特征。 -
与
DNN不同的是,将DNN与结构化SVM一起训练可以同时更新两者的参数 -
可以再用一个
DNN代替结构化SVM,即将(x,y)作为输入,F(x,y)(相似度标量)作为输出。
-
第二十六章 结构化学习 - Sequence labeling 序列标注
-
Sequence Labeling序列标注问题为:模型要寻找的目标函数的输入是一个序列(序列向量形式),输出也是一个序列,并且假设输入输出的序列长度相同,该任务可以利用RNN(循环神经网络)来解决,但是本章使用的是基于结构化学习的方法进行解决(两步骤,三问题) -
Example Task:POS tagging词性标注任务-
标记一个句子中每一个词的词性
-
输入一个句子,模型会将每个词进行标注,eg. 专有名词,形容词动词等
-
仅靠查表不够完成,因为需要联系上下文信息才能确定词性
-
-
Outline:HMM,CRF,Structured Perceptron/SVM,Towards Deep Learning -
Hidden Markov Model HMM隐马尔科夫模型 - 生成句子:-
步骤一:
-
基于语法(根据脑中内建的语法)生成POS序列:假设大脑中的马尔科夫链,放在句首的词性概率,进行随机采样,继续根据采样结果后个词的词性概率采样,循环直至结束。
-
示例给的句子词性是
PN V D N(专有名词,动词,冠词,名词),则用概率形式表示为(P("PN V D N")=0.4 * 0.8 * 0.25 * 0.95 * 0.1)(包括结束)
-
-
步骤二:
-
基于词典根据词序生成一个句子:根据词性找出词典中对应词汇,从不同词性集合中采样出不同词汇出现的概率。
-
示例给的句子是
"John saw the saw",即(P("John saw the saw"|"PN V D N")=0.2 * 0.17 * 0.63 * 0.17)。 -
HMM可以描述为利用POS标记序列得到对应句子的几率,即:(P(x,y)=P(y) cdot P(x|y) = P("PN V D N") cdot P("John saw the saw"|"PN V D N"))
-
-
隐马尔科夫模型的一般性解释:
-
Step1是转移概率,即(P(y)=P(y^{1}|start) cdot prod P(y^{k+1|y}) cdot P(end|y^{L}))
-
Step2是发散概率,即(P(x|y)= prod P(x^{k}|y^{k}))
-
-
概率估计:对于上述概率(P(y^{k+1|y})),(P(x^{k}|y^{k})),从训练数据中得到
-
转移概率等价于现在训练集里面
s出现的次数除以s后面跟s'的次数 -
发散概念等价于
s在整个词汇中出现的次数除以s词性的目标词汇次数
-
-
词汇标记:
-
任务是计算(P(x,y)),给定
x(Observed),发现y(Hidden)。 -
$y =argmaxP(y|x) -> argmaxfrac{P(x,y)}{P(x)} -> argmaxP(x,y) (,所以转化为只要穷举所有的)P(x,y)$,找出使其几率最大的
y即可。
-
-
Viterbi维特比算法:应用非常广泛的动态规划算法,在求解隐马尔科夫、条件随机场的预测概率计算等问题常用。-
假设有(|S|)个标记,序列(y)的长度为(L);有可能的(y)即(|S|^{L})(空间极为庞大)
-
利用维特比算法解决(y=argmaxP(x,y))复杂度为(O(L|S|^{2}))
-
-
把上述步骤做个总结:
-
模型:(F(x,y)=P(x,y)=P(y)P(x|y))
-
推导:给定
x,求出最大y,使得定义函数值达到最大(即维特比算法):(y=argmaxP(x,y)) -
训练:从训练集中得到(P(y)) 和 (P(x|y)),该过程就是计算概率的问题或是统计语料库中词频的问题
-
缺点:可以通过提高模型的复杂度弥补该缺点,但是要尽量避免过拟合
-
在推导过程中对(y=argmaxP(x,y)),我们需要((x,hat{y}):P(x,hat{y})>P(x,y)),对此
HMM可能无法处理该类问题 -
通常情况下,隐马尔可夫模型是判断未知数据出现的最大可能性,即((x,y))在训练数据中从未出现过,但可能有较大的概率(P(x,y));
-
当训练数据很少的时候,使用隐马尔可夫模型,其性能表现是可行的,但当训练集很大时,性能表现较差。
-
隐马尔可夫模型会产生未卜先知的情况,因为转移概率和发散概率,在训练时是分开建模的,两者是相互独立的,我们也可以用一个更复杂的模型来模拟两个序列之间的可能性,但要避免过拟合。所以下述引入条件随机场,模型与马尔科夫模型一样,但是可以克服其缺点。
-
-
-
Conditional Random Field CRF条件随机场-
条件随机场模型描述的也是(P(x,y))问题,但是表现形式不一样:(P(x,y) propto exp(w cdot phi (x,y))),其中(phi(x,y))是一个特征向量,(w)是一个权重向量,可以从训练数据中学习得到,(exp(w cdot phi (x,y)))总是正的,可能大于1。
-
所以有:(P(x,y)=frac{exp(w cdot phi (x,y))}{R}),(P(y|x)=frac{P(x,y)}{ΣP(x,y^{r})}= frac{exp(w cdot phi{x,y})}{Z(x)}),其中(Σexp(...))仅与(x)有关,与(y)无关。
-
其实
HMM和CRF模型上实则是一个东西:-
HMM模型:(P(x,y)=P(y^{1}|start) cdot prod P(y^{k+1|y}) cdot P(end|y^{L}) prod P(x^{k}|y^{k})) -
对其取对数
log得到:(logP(x,y)=logP(y _ {1}|start) + ΣlogP(y _ {l+1}|y _ {l}) + logP(end|y _ {L}) + ΣlogP(x _ {l}|y _ {l})),其中$ ΣlogP(x _ {l}|y _ {l}) = ΣlogP(t|s) cdot N _ {s,t}(x,y) (,Σ表示穷举所有可能的标记`s`和所有可能的单词`t`,)logP(x _ {l}|y _ {l})(表示给定标记`s`的单词取对数的形式,)N _ {s,t}(x,y)$表示为单词t被标记成s,在(x,y)对中总共共出现的次数 -x是实词,y是词性 -
$ ΣlogP(x _ {l}|y _ {l}) = ΣlogP(t|s) cdot N _ {s,t}(x,y) (等价于两个向量做内积,进而可以用)w cdot phi (x,y)(表示,因此隐马尔可夫模型的)logP(t|s)(转为对应维度上的权重(出现几率),) phi (x,y)(表示)N _ {s,t}(x,y)$,标签与单词、标签之间的特征向量,很大的一个稀疏矩阵。
-
-
条件随机场 - 训练标准:
-
找到一个权重向量取最大化目标函数
O(w),即使得最大化给定的x所产生y正确标记的几率,对其其对数进行累加:(w' = argmaxO(w)),(O(w)=ΣlogP(y^{n}|x^{n}))。类似于交叉熵,也是最大化正确维度的几率再取对数,只不过现在是针对整个序列而言。 -
对(logP(y|x))进行变换:(P(y|x)=frac{P(x,y)}{ΣP(x,y')}),(logP(y^{n}|x^{n})=logP(x^{n},y^{n}) - logΣP(x^{n},y')),根据
CRF定义即前项最大化观测到的几率,后项最小化未知的几率。
-
-
条件随机场 - 梯度上升:
-
梯度下降:找到一组参数
θ,最小化成本函数C,即梯度反方向 - ( heta ightarrow heta - eta igtriangledown C( heta)) -
梯度上升:找到一组参数
θ,最大化成本函数O,即梯度同方向 - ( heta ightarrow heta + eta igtriangledown O( heta))
-
-
条件随机场 - 训练:
-
定义目标函数:(O(w)=ΣlogP(y^{n}|x^{n})=ΣO^{n}(w))
-
计算梯度:(igtriangledown O^{n}(w)=[... partial O^{n}(w)/ partial w _ {s,t} ... partial O^{n}(w)/ partial w _ {s,s'}]),
s为词性,t为的单词。偏导求解得到:(frac{partial O^{n}(w)}{partial w _ {s,t}}=N _ {s,t}(x^{n},y^{n}) - ΣP(y'|x^{n})N _ {s,t}(x^{n},y')) -
其中第一项是单词
t被标记为s在((x^{n},y^{n}))中出现的次数,第二项是累加所有可能的y,每一项为单词t被标记成s,在(x _ {n})产生任意y出现的次数,在给定(x _ {n})下产生任意标记的几率。 -
实际意义解释:如果
-
-