DeeEEEeeep_Learning
Ref:
- https://zh.d2l.ai/index.html
《动手学深度学习》第二版 - https://www.bilibili.com/video/BV1Pa411X76s/?p=17&spm_id_from=pageDriver&vd_source=21687f13b3a0514d15ea0171e45d7ded 吴恩达机器学习Deeplearning.ai课程
- https://speech.ee.ntu.edu.tw/~hylee/ml/2022-spring.php HUNG-YI LEE MACHINE LEARNING 2022 SPRING
对机器学习的查漏补缺
1. 模型收敛——代价函数极小:梯度下降算法(Gradient descent algorithm)
考虑一个二元代价函数:
想求得满足条件的
式中,
举例:线性回归模型
model:
Cost func:
Gradient Descent Algorithm:
initialize
Batch gradient descent: 用所有的数据来进行梯度下降(但其实很多时候是取子集)。
2. 从一元线性模型到多维特征——向量化
模型变化:
代价函数的变化:
- 利用
for
循环实现矢量点积; - 利用
np.dot(vector_1, vector_2)
实现
Normal Equation(正规方程):
针对线性回归问题的梯度下降替代算法
多元线性回归问题中的参数
:对于取值范围不同的特征,采取缩放的手段,有利于梯度下降算法运行。
方式1:均值标准化
方式2:z-score标准化
(其实还有很多,详见《数据挖掘》理论与实践) 方式三:最小最大值标准化
方式四:小数标准化
- 学习率
:
迭代次数-损失函数图:也称学习曲线(learning curve)
自动收敛测试: 设置一个阈值
学习率设定过大,对于二次函数型的代价函数,迭代多次可能损失函数越来越大,对于其他震荡函数,也很难得到一个真正的极小值。
经验:With a small enough
3. 从线性到非线性——Polynomial Regression
玄学:Feature Engineering (用你的直觉/想象力,通过之前模型中的特征,对他们进行变换、组合,从而得到新的特征的过程)
4. 分类问题
逻辑回归(logistic regression,西瓜书翻译为对数几率回归,怪怪的)
线性回归并不适合分类问题,因为分类问题的输出是有限的。
决策边界与逻辑回归:
逻辑回归的输出总是在0-1之间,逻辑回归虽然名字里有“回归”,但它更适合用到二元分类问题中(历史遗留问题)
举例:肿瘤大小判断发病与否(二元分类问题)
利用Sigmoid函数建模分类问题:
决策边界定义为:
Ex.1:
更复杂的边界函数:引入交叉乘积项(椭圆边界),高次幂项(不规则边界)。。。
逻辑回归的代价函数
仿照线性回归问题构造。。。
数学上可证明,是非凸函数(non-convex function)
损失(Loss):
对于逻辑回归的损失函数:
代价函数也因此为如下形式:
太麻烦了。。。有什么办法简化一下吗?
之所以采用如上的损失函数,是来自统计学中的最大似然估计。
逻辑回归中利用梯度下降找到损失函数的极小值
步骤和线性回归相同:
不同之处在于,线性回归中的
OVER-FITTING & UNDER-FITTING!!!
解决过拟合的方法:
- 收集更多的训练集数据
- 增加/减少训练特征
- 正则化(最实用)
正则化
指导思想:奥卡姆剃刀原理:“如无必要,勿增实体” (Entities should not be multiplied unnecessarily)
Numquam ponenda est pluralitas sine necessitate.(避重趋轻)
Pluralitas non est ponenda sine necessitate.(避繁逐简)
Frustra fit per plura quod potest fieri per pauciora.(以简御繁)
Entia non sunt multiplicanda praeter necessitatem.(避虚就实)
式中,
对b无论是否进行正则化,影响不是很大,所以最后一项可要可不要。
用于线性回归的正则化
其中,
用于逻辑回归的正则化
(跟线性回归完全一样~)
深度学习神经网络
神经元与大脑
Activation(激活):指神经元向下游的其他神经元发送的输出(来源于神经生物学的术语)
Layer:层,代表若干神经元
Multilayer Perception: 多层感知机(包含输入层、隐藏层、输出层的很简单的神经网络)
激活值
在神经网络中,
神经网络进行推理和预测:前向传播算法
通常越接近输出,激活值越来越少,最终为一个标量值。(通常而言)
前向传播与训练过程中的反向传播形成对比。
向量化
Tensorflow 框架
tensorflow中,Logistic loss函数又称为BinaryCrossEntropy(二进制交叉熵,统计学概念,又由于强调是二元分类问题,故得此名。)
tensorflow框架中,梯度下降更新w,b的循环操作被称作“反向传播(back propagation)”
其他的激活函数
有时模型不支持二元化分类。。。
ReLU (Rectified linear unit) Function
Linear Activation Function
该函数也等价于没有用到任何的激活函数。
输出层(output layer)的激活函数的选择标准?
问题描述 | 激活函数 | 输出 |
---|---|---|
二元分类问题(非零即一) | Sigmoid Function | y = 1(positive)的概率 |
回归问题(输出有正有负) | Linear Activation Function | 预测结果 |
回归问题(输出只有正值) | ReLU (Rectified linear unit) Function | 预测结果(只有正值,例如预测房价) |
隐藏层(hidden layer)的激活函数
ReLU函数更加广泛使用,原因有几点:
ReLU相比Sigmoid计算更快
ReLU仅仅把小于零的部分平坦化,使得神经网络训练速度更快
tanh-function
LeakyReLU function
P-ReLU function
swish activation function
为什么需要激活函数?
如果全部是线性激活(等于不激活),整个神经网络和线性回归并无差别。但很多情况下神经网络处理的问题往往比线性复杂很多。
多分类问题
输出:(两个以上的)少量的离散的类别
softmax回归算法——逻辑回归算法的推广
举例:当输出可能有四种类别时
计算:
其中,
下面计算回归函数:
通式:对于N类分类问题
softmax回归模型的损失函数
重新审视Logistic Regression的损失函数:
如果定义
softmax回归算法中
softmax部署到神经网络中
softmax与其他激活函数的区别:softmax函数的每一个输出和这一层的所有参数都有关。
tensorflow中部署softmax层
SparseCategoricalCrossEntropy(稀疏分类交叉熵),与intensive...对比,前者的损失函数要求输出y只是有限个种类中的一种。
改进实现
为了减少数值舍入误差,通常不计算中间值
代码中体现为:
1 | model.complie(loss=BinaryCrossEntropy(from_logits=True)) |
该行代码表示,output layer不使用任何激活函数(线性激活),把激活函数(二元分类为Sigmoid、多元分类为Softmax)和损失函数的标准一同作为一层进行计算。
Multi-label Classification(多标签分类问题)
和上面讨论的分类问题不同,多标签分类问题的输出是一个向量(多个输出),但针对每个标签,可能是二元分类问题,也可能是多元分类
高级优化算法
比梯度下降更好的。。。?
Adam Algorithm
梯度下降的固有问题,在于学习率的值不能根据实际优化问题而变化,这使得模型训练过程中速度/效率没有办法得到更大提升。因此,Adaptive Moment Estimation(Adam,自适应矩估计)算法应运而生。
Adam算法背后的直观理解是,当进行梯度下降时,
在tensorflow框架中,体现为:
1 | model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3), |
神经网络中的“层”的类型
Dense Layer
致密层中的每一个神经元的输出都是前一个层中所有的激活值的函数。
Convolutional Layer(卷积层)
卷积层的好处:
- 计算速度更快
- 使用更少的计算数据,模型更不容易过拟合。
反向传播算法(Back Propagation)
计算图
Debug自己的机器学习项目
1. 模型评估
分割训练集和测试集。注意:计算测试集的损失函数时,不包括对参数的正则化项。
2. 模型选择
training set:设定模型参数
cross validation set:为了更好的选出模型种类
test set:验证模型的泛化能力,不能参与参数的变更
3. Bias & Variance
high bias: 训练集的误差较大,交叉验证集的误差也较大。代表模型欠拟合
high variance: 训练集的误差较小,但是交叉验证集的误差较大。代表模型过拟合。
找baseline很重要!!!
正则化对偏差与方差的影响:
4. learning curve(学习曲线)
如果一个模型是高偏差的,那么一味增加数据只是徒劳,不会对训练效果有显著提升。
如果一个模型是高方差的,那么增加数据有可能对训练模型起到积极的作用。
5. 其他debug方法
- 减少训练所需的特征——处理高方差问题
- 增加训练所需的特征——处理高偏差问题
- 增加高次幂特征/交叉积特征——处理高偏差问题
- 减少
(正则化参数)——处理高偏差问题 - 增大
(正则化参数)——处理高方差问题(防止过拟合)
bias & variance in NN
bias和var的权衡(tradeoff)问题:
大型神经网络一般都是低偏差模型。
tensorflow中,对神经网络中的某一层进行正则化操作:
1 | layer_1 =Dense(units=25, activation="relu", kernel_regularizer=L2(0.01)) |
说明: kernel_regularizer:初看似乎有点费解,kernel代表什么呢?其实在旧版本的Keras中,该参数叫做weight_regularizer,即是对该层中的权值进行正则化,亦即对权值进行限制,使其不至于过大。
可以看出,之所以叫L2正则化,是因为它是平方项之和。所以从名字,就可以写出它们的表达式。
L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择
L2正则化可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合
ref:https://zhuanlan.zhihu.com/p/352437358
误差分析:
数据增强操作(Data Augmentation)
引入失真(distortion),增加模型的泛化性。
数据合成。。。
迁移学习
本质:
把别人的网络copy过来,改一下输出层(x),或者重新训练输出层的权重值和偏置(因为维度变了,之前的权值不能用了)。或者重新训练所有层。
处理倾斜数据集(skewed dataset)
利用混淆矩阵:
Precision:
Recall:
F1-Score:(Precision和Recall的调和平均)
决策树
决策树的特征选取原则是“Maximize Purity”
Entropy(熵)用来衡量数据簇的不纯度:(
(更多量度见《数据挖掘·理论与实践》)
深度神经网络的随机初始化
如果所有的初始权重都为0,将会发生什么?(b初始化为0问题不大)
以下面的神经网络为例子:
hidden layer中的两个神经元不断地在计算完全相同的激活函数。
正确的做法是:
1 | w_1 = np.random.randn((2,2)) * 0.01 # 初始化为一个很小的随机值 |
tips:通过隐藏层输出(z)的维度和输入维度(x/a),来确定权重矩阵的维度(w)
深度神经网路的可视化解释(以CNN为例)
Dropout用于防止模型过拟合
Inverted Dropout:
Vanishing Gradients
产生原因:网络过深,权重矩阵以指数速度影响(增大或减少)输出结果。
解决方法:
- 随机初始化参数 对于单个神经元:
当n足够大时,设 的 方差为
规定:
如果中间层使用的激活函数是ReLU函数,则
如果使用的是tanh激活函数,则:(Xaiver Normalization)
Yoshua Bengio等还提出另一种标准化的方法:
Optimization Algs.
Mini-batch 梯度下降
Exponentially weighted averages(指数加权平均。EWA)
在计算资源和内存消耗上体现出明显优势。
bias correction in EWA
预测初期:
Gradient descent with momentum (动量梯度下降)
在第t次迭代: 在当前的批处理数据上计算
Hyperparameter:
有无偏差修正一般不影响,加上也可以
RMSprop
在第t次迭代: 在当前的批处理数据上计算
工程应用为了保证数值稳定(防止
Adam = momentum + RMSprop
如何调参更有效
"Coarse to fine" principal
Batch Normalization
思想:借鉴输入归一化,将每一隐藏层的中间输出(激活值:a或z,工程中常用z归一化)归一化,以便更快速地训练出相应的w和b。
方法:
通过下列式子:
这么做的一大原因是,我们想更好地利用非线性激活函数的非线性部分(以sigmoid为例,近似线性的部分集中在0附近,而我们想要偏离这一区域,就需要再重新设定z的均值)。这也说明了,Batch Norm这一过程是发生在计算z和a之间的。
batch
norm也可以与Mini-batch结合在一起使用。b在归一化之后就没有意义了,取而代之的参数是
batch norm还有略微提供一点正则化的效果,尤其是作用在mini-batch上,由于每次计算方差是在一小撮数据集,不代表整体数据集,因此计算得到的方差可以被看作加入了一点噪声(不准确因素),这与dropout的效果类似(使一个隐藏层的神经元有概率输出为0)
test set上运用batch norm的时候,由于test set是一个一个样本处理的,没有batch的概念,故需要从训练集(training set)中估计均值、方差。
Deep learning frameworks
- Caffe/Caffe2
- CNTK
- DL4J
- Keras
- Lasagne
- mxnet
- PaddlePaddle
- TensorFlow
- Theano
- Torch
正交化的调参思想
Convolutional Nerual Networks
Why Conv?
CNN的共性:
- 多数参数集中在Full-Connection Layer(FC layer)
- 从浅到深隐藏层的神经元数目逐渐递减
- 基本包括卷积、池化、全连接三个步骤
CNN的好处:
Parameter Sharing: 对于特征检测(比如边缘提取任务),一个对于图片中某一块有作用的特征探测单元,那么它对图片的其他区域也同样适用。
Sparsity of connections: 在CNN的每一层中,每一个输出值都依赖于很少的一部分输入。
几个经典网络
LeNet-5(1998)
论文阅读:
Structured Risk Minimization(abbr.SRM)
Feature Map: the set of outputs of the units in such a plane
(LeNet的一些分类策略还是太落后了~)
AlexNet(2012)
Local Response Norm:局部响应归一化,(但是用处不是很大)
VGG-16(2015)
简化CNN的架构
Residual Nerual Networks(Resnet)
Residual block
注意:加性操作是在下下一层激活之前
ResNet咋就这么好用?
如果在正则化的时候,导致
再加一条前提假设,假如隐藏层使用的是ReLU激活函数,则输出一定是大于零的,则有
这证明了加了一层residual block,不会使得训练结果变差。且假设很深的时候梯度消失了,残差块可以让网络回到梯度消失前的状态
1x1 conv?
1x1卷积对多通道输出进行有力的降维/升维打击,构建成bottleneck layer,减少inception的计算成本
如果不进行维度变换,1x1卷积也会增加ReLU的次数,网络会学习到更复杂的非线性关系。
Inception
不知道用哪种卷积块、或者要不要用池化层,inception说:好吧那就都用)
Computer vision tech.
Localization
Object Detecting
如何高效的滑窗?把全连接层变成卷积层:
卷积核的大小等于一个通道的输入维度。
YOLO algorithm
output:
交并比(Intersection over union)
评估对象检测任务,检测框框的质量 (框没框,如框)
一般认为,
非极大值抑制(non-max suppression)
目的是防止一个物体触发多次检测。
Anchor Boxes:
对于重叠的物体,预先设定若干个形状相差很多的boxes(框框)。设定输出为
候选区域(region proposal) R-CNN
对象检测任务中,某些地方真的没有东西,但是CNN还要计算一遍。由此,Regions of CNN(R-CNN)应运而生。方法是运行图像分割算法
改进:Fast R-CNN
应用卷积滑窗
再改进:Faster R-CNN
利用卷积来实现图像分割
Face Recognition
Oen-shot Learning:
学习一个"相似度"函数:
d(img1, img2) = 两幅输入图片的不同程度。
if d
Siamese Network
triplet loss
神经风格迁移
深度神经网络到底在学到些啥?
layer 1中随便取一个unit,找到九个图像块使得这个unit的激活值最大。
对风格迁移拟定代价函数
初始化(随机生成)一张图片
Gradient Descent 最小化
ConvNet for 1D
怎么表征序列数据?
以NLP为例,想表征一个句子里的每一个单词,首先要有一张巨大的词库(Vocabulary),词库中的单词按照字母顺序排列并顺序编号。再用独热码表示每个单词。
Recurrent Neural Network
为什么对于序列信息不使用传统多层全连接的前馈神经网络?
输入输出在不同的应用案例中可能维度不同,这对于序列处理来说极其不方便。
文本序列不具有特征共享的属性。
通常
不难发现,单向的循环神经网络是没有之后的信息为当前预测做反馈的。这也是RNN的弊端之一。
RNN的Forward Prop
针对
简化RNN的记号
RNN的损失函数与反向传播
用交叉熵定义某个单词/某个时间点的预测损失为
整个序列的损失函数:
RNN的各种架构
输入输出长度相等(也可能不等,比如翻译任务):多对多架构
输入为一个序列,输出一个结果:多对单架构
输入为很短的序列或仅仅一个单词,输出很长:一对多架构(例如音乐生成)
已训练好的RNN模型可以通过采样的方式生成序列,过程和One-to-Many的RNN类似,将每次输出采样取概率最大值的对象作为下一步长的输入。
RNN的梯度消失问题
RNN的一大缺点就是,如果网络非常深,输出又很大程度依赖于很前面的单词/元素,那么网络性能会变差。
Gate Recurrent Unit for RNN (门控循环单元)
新概念:memory cell:
在GRU里,
别急,我知道屏幕前的你已经混了,没关系,我也混了
GRU的核心思想——建立一个门
LSTM
LSTM中,不存在GRU里的
新的来力,与GRU不同,LSTM在更新
还顶一个门控函数代表output:
Bidirectional RNN
对于第t个步长,预测值为
式中,
当然上图中的每一层都可以替换成GRU和LSTM单元。
BRNN也有它的缺点,数据量必须是完整的才可以。(比如对于一个语音处理应用,如果部署了BRNN,那么用户每次必须说完一整句话,程序才会进行处理。)
Deep RNN
Attention Model
Attention是对BRNN(with or without GRU & LSTM)的一个大改进:
一切的核心就在如何计算注意力权重
每个
ConvNet for 3D
例如:CT断层扫描数据
(带天坑!!)
- 标题: DeeEEEeeep_Learning
- 作者: Eric Zhang
- 创建于 : 2023-11-09 23:45:20
- 更新于 : 2023-12-03 23:44:38
- 链接: https://ericzhang1412.github.io/2023/11/09/DeeEEEeeep-Learning/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。