AI
- 前言
- 最新AI产品
- 前馈神经网络Feed Forward Neural Networks
- 模型model——感知器Perceptron
- XOR Problem
- 感知器作为通用函数近似器
- 通用逼近定理Universal Approximation Theorem
- Softmax 函数
- one-hot encoding
- "Softmax loss"
- 损失函数 Loss functions
- 二分类问题的交叉熵损失(Cross-entropy Loss):
- 多分类问题的交叉熵损失(Cross-entropy Loss):
- 分类问题的Hinge 损失(Hinge Loss)
- Hinge loss for multi-class problems
- 回归问题的均方误差(Mean Squared Error)——L~2~ loss:
- 回归问题的平均绝对误差(Mean Absolute Error):
- 优化Optimization
- 梯度下降 Gradient Descent
- 批梯度下降 Batch Gradient Descent
- 随机梯度下降 Stochastic Gradient Descent,SGD
- 小批量随机梯度下降 Mini-Batch SGD
- 次梯度算法Subgradients
- 动量Momentum
- Nesterov Accelerated Gradient (NAG) / Nesterov Momentum
- 自适应梯度
- AdaGrad
- RMSprop
- Adadelta
- Adam
- AMSGrad
- 链式法则 Chain Rule
- 反馈回路 Feedback Loop
- 激活函数 Activation Function
- Sigmoid激活函数
- Tanh激活函数
- ReLU激活函数
- Leaky ReLU / Parametric ReLU
- Exponential Linear Unit (ELU)
- Scaled ELU (SELU)
- 寻找最优激活函数
- 卷积神经网络 (CNN)
- 卷积层(Convolutional Layer)
- 填充Padding
- 多通道卷积Multi-channel convolution
- 跨步卷积Strided Convolutions
- 膨胀/空洞卷积Dilated/Atrous Convolutions
- 1x1卷积 1 × 1 Convolution
- 池化层(Pooling Layer)
- 全连接层(Fully Connected Layer)
- 正则化 Regularization
- Bias Variance Tradeoff
- 经典技术
- 数据增强Data Augmentation
- 损失函数中的正则化
- 归一化Normalization
- Batch Normalization(批归一化)
- 内部协变量偏移Internal Covariate Shift
- 自正则化神经网络(SNN)
- Dropout
- 初始化 initialization
- Xavier initialization
- He initialization
- 迁移学习 Transfer Learning
- 多任务学习 Multi-Task Learning
- 开始训练
- 训练之前
- 训练中
- 优化方法选择
- Hyperparameter优化
- 评价
- 架构Architectures
- 早期架构Early Architectures
- LeNet-5
- AlexNet
- VGG Network
- GoogleNet
- 退化
- 解决方法: Residual Units
- ResNet
- ResNeXt
- DenseNets
- SENet
- 递归神经网络 RNN
- BPTT
- TBPTT
- Long Short-Term Memory Units
- Gated Recurrent Units
- Attention
- 深度强化学习 Deep Reinforcement Learning
- Multi-armed bandit problem
- 最大预期奖励
- 利用 Exploitation
- 探索 Exploration
- Markov Decision Process
- Policy Iteration
- 无监督深度学习Unsupervised Deep Learning
- Restricted Boltzmann Machine
- Autoencoder
- 自动编码器变体
- 变分自编码器 VAE
- 生成对抗网络 Generative Adversarial Networks
- 评估GAN
- 条件生成对抗网络
- One-sided Label Smoothing
- 模式崩溃 Mode Collapse
- 解决办法:Unrolled GAN
- 语义分割 Semantic Segmentation
- 评价指标
- 编码器和解码器
- upsampling 上采样
- Bed of Nails
- Integrating Context Knowledge
- SegNet
- U-Net
- 其他方法
- 条件随机场 Conditional Random Fields
- 目标检测Object Detection
- 滑动窗口 Sliding window
- Regional CNN
- Fast R-CNN
- YOLO
- Single-Shot MultiBox Detector (SSD)
- RetinaNet Detector
- 实例分割 Instance Segmentation
- Mask R-CNN
- weakly deep learning
- Contrastive SSL
- Supervised Contrastive Learning
- Supervised Contrastive Loss
- Bootstrap SSL – A paradigm change
前言
深度学习作为人工智能的一个分支,在近年来取得了惊人的成就,尤其是2023年初,基于chatGPT,Midjourney等为首的AI产品广泛应用于图像识别、自然语言处理、语音识别等领域。作为一名深度学习初学者,我们需要从基础开始学习,掌握深度学习的理论知识和实践技巧。但是,由于深度学习涉及的知识面非常广泛,加之近年来领域发展迅速,我们学习深度学习时需要消耗大量的时间和精力来整理和吸收相关的知识。因此,我特别在这整理了一些深度学习内容,希望能够为自己和其他初学者提供一些帮助,让大家更快更好地掌握这些核心概念。(注:该前言即为chatGPT润色版本)
最新AI产品
此处列举一些最新的AI产品
2023年5月15日更新
-
PaLM 2
由Google开发,据说拥有超越GPT4的能力。该模型在逻辑和推理方面更加强大。根据基准测试,对于具有思维链 prompt 或自洽性的 MATH、GSM8K 和 MGSM 基准评估,PaLM 2 的部分结果超越了 GPT-4。其在不同语言场景下,都达到了更加优秀的水平,包括但不限于多语言代码注释,高水平语言测试,俚语理解等。
PaLM 2 包含了 4 个不同参数的模型,包括壁虎(Gecko)、水獭(Otter)、野牛(Bison)和独角兽(Unicorn),并在特定领域的数据上进行了微调,为企业客户执行某些任务。
另外,PaLM2 有一个基于健康数据训练的版本 Med-PaLM 2,可以轻松通过美国医学执照考试,达到「专家」水平。
一个基于网络安全数据训练的版本 Sec-PaLM 2,可以解释潜在恶意脚本的行为,检测到代码中的威胁。这两种模型都将通过谷歌云提供给特定客户。 -
Duet AI
Duet AI给谷歌办公全家桶 Workspace 来了一个全新升级,其会涵盖谷歌的各种办公软件,包括在文档和 Gmail 中的写作辅助、幻灯片的图片生成、Meet 的自动会议摘要等等。 -
Magic Editor
是谷歌最新公布的照片处理功能,使用生成性 AI,可以让用户在没有专业工具的情况下对照片进行各种编辑,预计下半年推出,值得期待。以此为首是否会改变美图秀秀等国内P图软件生态。 -
Bard
Google版chatGPT,也是用来和Bing竞争的对手产品,近日Google发布消息表示决定取消Bard 的等候名单 —— 将在 180 个国家或地区提供服务。同时未来也能像 ChatGPT 一样,接入网络,实时搜索网页。和前两这相比,Bard仍有不少差距,只能说潜力无限。
2023年4月16日更新
- AutoGPT
AutoGPT是一个基于GPT-4的开源项目,其可以通过Github下载源码并部署安装,其最大的特点是在于能根据任务指令自主分析和执行,甚至还会自己给自己提出新的问题并回答。
当你提出一个需求或者任务时,他会分析这个问题,并且给出执行目标和具体任务,然后开始执行。
链接 - https://github.com/Significant-Gravitas/Auto-GPT - AgentGPT
这是AutoGPT的平替产品。它是一款基于浏览器的工具,同样会自主思考并且且分解为多个子任务。这两款和chatGPT相比最大的变化在于prompt的重要性体现。它们可以更聪明,更灵活,执行力更强。
链接 - https://agentgpt.reworkd.ai/
2023年4月7日更新
- Segment-Anything Model(SAM)
昨日,Meta 发布首个可“任意图像分割”的基础模型 Segment-Anything Model(SAM)和最大规模的“任意分割 10 亿掩码数据集「Segment Anything 1-Billion mask dataset (SA-1B)」,将自然语言领域的 prompt 范式引入了 CV 领域,进而为 CV 基础模型提供更广泛的支持与深度研究。
链接 - https://ai.facebook.com/research/publications/segment-anything/
小于50Masks的情况
分割结果
100到200Masks的情况
分割结果
SAM最强大的地方之一是他的零样本迁移能力( Zero-Shot Transfer)他可以涵盖广泛的用例,并且可以直接在新的图像“领域”上使用——无论是水下照片还是细胞显微镜——都不需要额外的训练。
SAM 已经学会了物体的一般概念,并且可以为任何图像或视频中的任何对象生成掩模,甚至包括在训练期间没有遇到过的对象和图像类型。
- chatGPT
全称聊天生成预训练转换器(英语:Chat Generative Pre-trained Transformer),是OpenAI开发的人工智能聊天机器人程序,于2022年11月推出。该程序使用基于GPT-3.5、GPT-4架构的大型语言模型并以强化学习训练。ChatGPT目前仍以文字方式交互,而除了可以用人类自然对话方式来交互,还可以用于甚为复杂的语言工作,包括自动生成文本、自动问答、自动摘要等多种任务。
从诞生之初就吸引了全世界的目光,短时间内就证明了在各个领域震撼人心的能力,开启了全世界大模型,海量数据的AI竞赛,也是从此,AI时代开始加速发展。
2023年4月6日更新
- Security Copilot
2023年4月4日Microsoft 发布网络安全产品Security Copilot,其能够在几分钟内提供可操作化建议,简化对攻击的紧急理解,揭示威胁,甚至预测攻击者最有可能的下一步行动。
链接 - https://www.microsoft.com/en-us/security/business/ai-machine-learning/microsoft-security-copilot - LOOP
微软一直在不断尝试推出新的办公文档格式。2020年,他们推出了Fluid,如今又推出了Loop,这是一个与MS Office密切相关,但又独立于它的协作工具。据说它与Notion的UI非常相似,包括文本块、页面和工作区,不过流畅程度较远。另外其内置了AI Copilot。
链接 - https://www.microsoft.com/en-us/microsoft-loop - Ghostwriter by Replit & Google
Replit 正在升级他们最近发布的编程助手 Ghostwriter,他们选择与 Google 合作,使用其优越的语言模型。它不再是临时的 copilot,而是端到端的项目助手,可以编写代码、修复错误、提出建议、编写测试、部署、审查并帮助协作。 - Video-to-3D API by Luma AI
Luma AI 通过他们的 Video-to-3D API,进一步实现了「互联网规模的 3D 世界」,该服务是 API 服务——每个场景需要 1 美元,开发者就能获得 NeRF 建模服务。 - 文生演示文档 by Tome & Gamma
Tome在3 月 23 日推出了第一个基于文档的 AI 演示工具,该工具基于 GPT-4,能够将文档转换成演示文稿、叙述和故事。结合 Tome 自研的渲染系统,这不仅是另一个生成幻灯片的工具,也不能简单与集成了 GPT 的 Powerpoint 类比。
紧接着就在上周五,Gamma 也推出了自己的文生演示文稿工具,不一样的风格,同样的顺畅工作流。
链接 - Tome:https://beta.tome.app/
链接 - Gamma:https://gamma.app/ - Fixie.ai
「第一个以企业为中心,构建 LLM 体验的 PaaS 公司」——但 2022 年 5 月底获得融资的 One AI,可能不这么认为。
简言之,Fixie.ai 是由 LLM 驱动的,与外部系统进行交互的代理,旨在将 LLM 与企业数据、系统与工作流相链接,当前可以与数据库、API(如 GitHub)、生产力工具(如 Google 日历)和公共数据源(如搜索引擎和社交媒体)交互,以生成和处理图像和文本。
链接 - https://www.fixie.ai/
-
Regex.ai
一款基于 AI 的正则表达式自动生成工具,开箱即用,所见即所得,选择数据,即可生成正则表达式,同时提供多种数据提取方式,较前一代用于调试正则表达式的 Rubular 等工具前进一大步,而相较 ChatGPT 也是更加直观——无需语言描述,直接选择想要获取的部分,自动完成正则表达式。
链接 - https://regex.ai/ -
Enhance AI
一分钟内在产品内集成最先进的 LLM(目前是 OpenAI GPT 模型)的低/无代码工具!
链接 - https://www.enhanceai.dev/?ref=producthunt -
Reimagine by HomeByte
可以实现室内装修的自动渲染,由房屋出售平台HomeByte 将这项功能整合进了平台,面向C端用户开放——可以畅想未来的入住场景
链接 - https://homebyte.com/reimagine/tag/latest -
Playground v1 by Playground AI
本模型可以提高生成图像的整体 HDR 质量。生成的图片看起来非常清晰,而且细节非常丰富。可以在其官网免费试用。
链接 - https://playgroundai.com/ -
Clip Interrogator
「图生文」反向工具——仅需上传图片至 Clip Interrogator 即可生成对应的 prompt !
对于 Midjourney 用户来讲倒也不必这么麻烦——David Holz 已宣布 Midjourney 正式实现「左手倒右手」,「图生文」反向输出功能上线。
链接 - https://replicate.com/pharmapsychotic/clip-interrogator
-
GPTCHA
日渐强大的 AI 早已引发我们对于诈骗自动化的担忧,刚刚赢得 AI for Good 黑客松第一名的 CPTCHA 则致力于解决其中重要的一部分——电话诈骗。这是一款由三位开发者共同搭建的由 GPT-4 驱动的小工具,拦截可疑电话,并用虚拟声音与呼叫方聊天,直到确认电话合法且安全。 -
ChatMind
利用 AI 自动生成思维导图的在线工具,只需要输入问题、文章、数据就可以了。并且对于问题,还能自己获取答案,可导出图片与 Markdown 文档两种格式。
前馈神经网络Feed Forward Neural Networks
前馈神经网络(Feedforward Neural Network)是一种常见的神经网络模型,也是最基本的神经网络模型之一。前馈神经网络是指信号在神经元之间单向传递,从输入层逐层向输出层传递,不形成环路或循环连接。
前馈神经网络通常由多个层组成,每个层包含多个神经元。输入层接受输入信号,输出层输出最终结果,中间的层被称为隐层。每个神经元都与前一层的所有神经元相连,每个连接都有一个权重,表示它对前一层神经元的影响程度。
前馈神经网络使用反向传播算法进行训练,即通过不断调整每个神经元的权重来最小化训练数据的误差。在训练完成后,前馈神经网络可以用于各种应用,如分类、回归、聚类等。
模型model——感知器Perceptron
感知器(Perceptron)是一种简单的二元分类器,其决策规则基于线性函数。Perceptron的决策规则可以简单地表示为:
z = w1x1 + w2x2 + … + wn*xn + b
其中,x1, x2, …, xn是输入特征,w1, w2, …, wn是对应的权重,b是偏置项。z是一个加权和,如果它大于等于某个阈值,则输出为1,否则输出为0。这个阈值可以看作是一个决策边界,将输入空间分成两个类别。
更具体地说,Perceptron的决策规则可以表示为:
if z >= 0:
output = 1
else:
output = 0
这可以用一个阶跃函数或符号函数(sign function)来实现
Perceptron可以被训练以调整权重和偏置项,从而能够正确地分类训练数据。训练的过程中,Perceptron会根据每个样本的真实类别和预测类别之间的误差,调整权重和偏置项。这个过程可以使用梯度下降算法来实现,以最小化训练数据的错误率。
XOR Problem
XOR问题是指对于一个输入包含两个二进制数字的二元组,输出结果为这两个数字是否相等的问题。在另一种形式的描述中,给定两个二进制数字,输出结果为它们的异或(XOR)值。例如,输入 (0, 1) 应该输出 1,而输入 (1, 1) 和 (0, 0) 应该输出 0。
XOR问题在计算机科学中被广泛用作测试和基准问题,因为它是一种非线性问题,无法使用单个神经元或线性分类器解决。这是因为 XOR 问题的输出不能用一个线性函数来表示,必须使用非线性函数来描述。
解决 XOR 问题的一种方法是使用多层感知器(Multilayer Perceptron,MLP),即一个包含至少一个隐层的前馈神经网络。通过使用隐层,MLP 可以学习到非线性函数,从而能够解决 XOR 问题。使用适当的权重和偏置项,MLP 可以在训练数据上达到很高的准确率,并且可以泛化到新的未见过的数据。
一个感知器类似单个神经元。
感知器作为通用函数近似器
通用逼近定理Universal Approximation Theorem
通用逼近定理(Universal Approximation Theorem)是指一个前馈神经网络可以在任意精度下逼近任何连续函数,只要它有足够的隐藏层(hidden layer)。
换句话说,通用逼近定理表明,只要给定足够的神经元和层数,前馈神经网络可以拟合任何连续函数。这个定理适用于大多数常见的激活函数,如 Sigmoid 函数、ReLU 函数和 tanh 函数等。
通用逼近定理的证明由 Cybenko 和 Hornik 等人在 1989 年提出。这个定理的发现是神经网络领域的一个重要里程碑,它为神经网络的应用提供了理论基础,并促进了神经网络的快速发展和广泛应用。
需要注意的是,通用逼近定理只是表明神经网络可以逼近任何连续函数,但它并不保证神经网络能够泛化到未见过的数据。因此,在实际应用中,我们需要使用一些技巧来防止神经网络出现过拟合或欠拟合的情况,以提高其泛化能力。
Softmax 函数
Softmax 函数是一种常用的神经网络激活函数,通常用于多分类问题中。它将一组实数转换为一个概率分布,其中每个元素的取值范围在 0 到 1 之间,而所有元素的和为 1。Softmax 函数可以将神经网络输出的原始分数转换为概率分布,从而方便我们进行分类任务。
Softmax 函数的公式如下:
s o f t m a x ( z i ) = e z i ∑ j = 1 K e z j \mathrm{softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}} softmax(zi)=∑j=1Kezjezi
其中, z i z_i zi 表示原始分数向量中的第 i i i 个元素, K K K 表示向量的长度。Softmax 函数将 z i z_i zi 转换为对应的概率值 s o f t m a x ( z i ) \mathrm{softmax}(z_i) softmax(zi),计算方法为将 e z i e^{z_i} ezi 除以所有 e z j e^{z_j} ezj 的和。
需要注意的是,Softmax 函数的计算结果对原始分数向量的大小和相对大小都非常敏感。因此,在实际应用中,我们需要对原始分数向量进行标准化或正则化等处理,以避免数值上溢或下溢等问题,并保证模型的稳定性和可靠性。
one-hot encoding
One-hot encoding 是一种将离散变量转换为连续变量的技术,通常用于机器学习中的特征编码。在 one-hot encoding 中,将一个分类变量的每个可能取值都表示为一个新的二元变量(即“独热编码”),并且只有一个变量被设置为 1,其他变量都被设置为 0。
例如,考虑一个颜色变量,可能取值为 “红色”、“蓝色”和“绿色”。通过 one-hot encoding,我们可以将这个变量表示为三个新的二元变量,分别表示是否为“红色”、“蓝色”和“绿色”。如果样本的颜色是“红色”,则对应的变量为 [1, 0, 0];如果是“绿色”,则对应的变量为 [0, 0, 1]。
使用 one-hot encoding 的好处在于,它可以避免机器学习算法将离散变量的取值之间建立错误的大小或顺序关系。例如,如果我们将颜色变量编码为数值变量(如 1 表示红色,2 表示蓝色,3 表示绿色),则算法可能会将颜色之间的差异视为数量上的差异,从而引入错误的偏差。使用 one-hot encoding,可以避免这种问题,从而提高算法的准确性。
需要注意的是,one-hot encoding 会增加变量的数量,可能会导致维度灾难的问题。因此,在实际应用中,我们需要权衡变量数量和算法性能,选择合适的特征编码策略。
“Softmax loss”
交叉熵和Softmax函数通常同时出现;
独热编码非常方便:表示一个直方图;
自然地处理多个类问题
损失函数 Loss functions
损失函数(Loss function)是用于评估模型预测结果与真实值之间的差异的函数。在机器学习中,我们通常使用损失函数来描述模型在训练数据上的表现,以便对模型进行优化和调整。
损失函数通常用于监督学习中的分类和回归问题。在分类问题中,损失函数衡量了模型对不同类别的分类结果与真实标签之间的差异。常见的损失函数包括交叉熵损失(Cross-entropy Loss)和 Hinge 损失(Hinge Loss)等。在回归问题中,损失函数衡量了模型对目标变量的预测结果与真实值之间的差异。常见的损失函数包括均方误差(Mean Squared Error)和平均绝对误差(Mean Absolute Error)等。
对于一个给定的训练数据集,我们可以将损失函数应用于模型的每个预测结果,并将所有预测结果的损失函数值加权平均,从而计算出模型在该训练数据集上的总体损失。我们的目标是通过调整模型的参数来最小化损失函数,使得模型的预测结果与真实值之间的差异最小化。这个过程被称为模型的训练或优化。
分类Classification: Estimate a discrete variable for every input.
回归Regression: Estimate a continuous variable for every input.
二分类问题的交叉熵损失(Cross-entropy Loss):
L = − 1 N ∑ i = 1 N [ y i log ( p i ) + ( 1 − y i ) log ( 1 − p i ) ] L = -\frac{1}{N} \sum_{i=1}^{N} [y_i \log(p_i) + (1-y_i)\log(1-p_i)] L=−N1i=1∑N[yilog(pi)+(1−yi)log(1−pi)]
其中, N N N 表示样本数量, y i y_i yi 表示第 i i i 个样本的真实标签, p i p_i pi 表示模型对第 i i i 个样本为正类的预测概率。
多分类问题的交叉熵损失(Cross-entropy Loss):
L = − 1 N ∑ i = 1 N ∑ j = 1 C y i j log ( p i j ) L = -\frac{1}{N} \sum_{i=1}^{N} \sum_{j=1}^{C} y_{ij} \log(p_{ij}) L=−N1i=1∑Nj=1∑Cyijlog(pij)
其中, C C C 表示分类数目, y i j y_{ij} yij 表示第 i i i 个样本的真实标签是否属于第 j j j 类, p i j p_{ij} pij 表示模型对第 i i i 个样本属于第 j j j 类的预测概率。
分类问题的Hinge 损失(Hinge Loss)
Hinge 损失(Hinge Loss)通常用于支持向量机(SVM)中,是一种用于解决分类问题的损失函数,公式如下:
L = 1 N ∑ i = 1 N max ( 0 , 1 − y i ⋅ y i ^ ) L = \frac{1}{N} \sum_{i=1}^{N} \max(0, 1 - y_i \cdot \hat{y_i}) L=N1i=1∑Nmax(0,1−yi⋅yi^)
其中, N N N 表示样本数量, y i y_i yi 表示第 i i i 个样本的真实标签, y i ^ \hat{y_i} yi^ 表示模型对第 i i i 个样本的预测值。在分类问题中, y i ^ \hat{y_i} yi^ 可以表示为样本 i i i 属于正类的置信度得分,取值范围为 [ − ∞ , ∞ ] [-\infty, \infty] [−∞,∞]。Hinge 损失函数的核心思想是,对于被正确分类的样本,它们的预测值与真实值之积应该越大越好,而对于被错误分类的样本,它们的预测值与真实值之积应该小于等于 − 1 -1 −1,因为 y i y_i yi 取值为 ± 1 \pm 1 ±1。
分类只取决于符号
铰链损失是错误分类损失的凸近似:
在机器学习中,铰链损失是一种常用的分类损失函数,通常用于二元分类任务。假设我们有一个样本x,它的真实标签为y∈{-1,1}。我们用一个线性分类器f(x)来预测样本x的标签,其中f(x)的取值范围为[-1,1],预测为1表示x属于正例,预测为-1则表示x属于负例。
当分类器的预测值f(x)和真实标签y相同号时,损失为0;当预测值和真实标签反号时,损失为|1-y*f(x)|,它可以被近似为一个凸函数max(0, 1-yf(x))。在这种凸函数下,当误分类越严重时,损失的增长越快,与实际情况更符合。
此外,铰链损失还有一个重要的特性,就是它是可导的。这使得我们可以在梯度下降等优化算法中使用它来更新模型参数。
Hinge loss for multi-class problems
铰链损失函数(Hinge loss)通常用于二元分类问题,但也可以扩展到多类别分类问题。下面是一种针对多类别问题的铰链损失函数的公式:
L ( w ) = ∑ M m = 1 ∑ K k ≠ c m a x ( 0 , 1 − y ^ c ( x m , w ) + y ^ k ( x m , w ) ) L(w) =\sum_{M}^{m=1} \sum_{K}^{k\ne c}max (0, 1 − \hat{y}c(x_{m} , w) + \hat{y}k(x_{m} , w)) L(w)=M∑m=1K∑k=cmax(0,1−y^c(xm,w)+y^k(xm,w))
L ( y , f ( x ) ) = m a x i 0 , 1 + Σ j ≠ y i m a x ( 0 , f j ( x ) − f i ( x ) ) L(y, f(x)) = max_i {0, 1 + Σ_j≠yi max(0, fj(x) - fi(x))} L(y,f(x))=maxi0,1+Σj=yimax(0,fj(x)−fi(x))
其中, y ^ \hat{y} y^是一个向量,表示样本x在所有类别上的预测值。 c ( x m , w ) c(x_{m} , w) c(xm,w)表示样本 x m x_{m} xm属于第M类的预测值, k ( x m , w ) k(x_{m} , w) k(xm,w)表示样本 x m x_{m} xm属于第K类的预测值,且k≠c。该公式的含义是,对于样本x,计算每个类别i的铰链损失,然后选择最大的损失作为整个样本的损失。其中,损失的计算方式是样本的真实标签与其他类别的预测值之差取最大值,然后与0或1相比较,取较大值。
回归问题的均方误差(Mean Squared Error)——L2 loss:
L = 1 N ∑ i = 1 N ( y i − y i ^ ) 2 L = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y_i})^2 L=N1i=1∑N(yi−yi^)2
其中, N N N 表示样本数量, y i y_i yi 表示第 i i i 个样本的真实值, y i ^ \hat{y_i} yi^ 表示模型对第 i i i 个样本的预测值。
回归问题的平均绝对误差(Mean Absolute Error):
L = 1 N ∑ i = 1 N ∣ y i − y i ^ ∣ L = \frac{1}{N} \sum_{i=1}^{N} |y_i - \hat{y_i}| L=N1i=1∑N∣yi−yi^∣
其中, N N N 表示样本数量, y i y_i yi 表示第 i i i 个样本的真实值, y i ^ \hat{y_i} yi^ 表示模型对第 i i i 个样本的预测值。MAE 的优点是它对异常值不敏感,但是在梯度下降中相对于均方误差(MSE)的收敛速度较慢。
优化Optimization
局部最小值可能优于全局最小值(过拟合!)
可能更关键的是:鞍点
实用建议:
首先使用 Mini-Batch SGD with momentum;
大多数时候是保持默认的动量;
当觉得自己的数据差不多时,可以尝试一下Adam;
首先使用Adam的默认参数;
首先调整学习率;
梯度下降 Gradient Descent
梯度下降(Gradient Descent)是一种常用的最优化算法,用于寻找损失函数的最小值。其基本思想是在每一步中,沿着负梯度方向(即损失函数下降最快的方向)更新模型参数,直到达到收敛条件为止。
梯度下降的公式如下:
w = w − l e a r n i n g r a t e ∗ ∇ L ( w ) w = w - learning_rate * ∇L(w) w=w−learningrate∗∇L(w)
其中, w w w 表示模型的参数向量, L L L 表示损失函数, ∇ L ( w ) \nabla L(w) ∇L(w) 表示损失函数对参数向量的梯度, l e a r n i n g r a t e learning_rate learningrate 表示学习率,控制每次更新的步长大小。梯度下降算法的过程可以简单描述为:初始化参数向量 w w w,重复执行以下步骤,直到达到收敛条件:
计算损失函数关于参数向量 w w w 的梯度 ∇ L ( w ) \nabla L(w) ∇L(w)
更新参数向量: w = w − l e a r n i n g r a t e ∗ ∇ L ( w ) w = w - learning_rate * \nabla L(w) w=w−learningrate∗∇L(w)
其中步长由学习率 l e a r n i n g r a t e learning_rate learningrate定义。
保证收敛到一个局部最小值local minimum。
在实际应用中,梯度下降算法还会涉及到一些优化技巧,比如动量(Momentum)、自适应学习率(Adaptive Learning Rate)、批量归一化(Batch Normalization)等。
批梯度下降 Batch Gradient Descent
批梯度下降(Batch Gradient Descent)在批梯度下降中,每次迭代时,算法会利用所有训练样本来计算损失函数的梯度,并利用该梯度来更新模型参数。因此,批梯度下降需要遍历整个训练集,所以在大数据集上训练时可能会受到计算资源的限制。
具体来说,批梯度下降算法的更新公式为:
θ = θ − η ∗ ( ∂ J / ∂ θ ) θ = θ - \eta * (∂J/∂θ) θ=θ−η∗(∂J/∂θ)
其中, θ θ θ是模型的参数向量, J J J是损失函数, η \eta η是学习率, ∂ J / ∂ θ ∂J/∂θ ∂J/∂θ是损失函数 J J J对 θ θ θ的偏导数。
在批梯度下降中,每次迭代都需要计算所有训练样本的梯度,这使得批梯度下降在训练时间上比其他梯度下降算法(如随机梯度下降)要慢,但是批梯度下降具有更好的收敛性和稳定性,因为它可以避免落入局部极小值。
在实践中,批梯度下降常常与一些加速技巧一起使用,例如动量法和自适应学习率方法,以提高算法的性能。此外,也可以使用小批量梯度下降(Mini-batch Gradient Descent),将训练集分成若干个小批量进行训练,从而在一定程度上平衡了计算效率和收敛速度的问题。
随机梯度下降 Stochastic Gradient Descent,SGD
随机梯度下降(Stochastic Gradient Descent,SGD),也称为在线梯度下降(Online Gradient Descent)。**与批梯度下降不同,SGD不是在所有训练样本上计算损失函数的梯度,而是在每个训练样本上计算梯度并更新参数,因此SGD的计算开销比批梯度下降更小。**具体来说,SGD的更新公式如下:
θ = θ − η ∗ ( ∂ J i / ∂ θ ) θ = θ - \eta * (∂Ji/∂θ) θ=θ−η∗(∂Ji/∂θ)
其中, θ θ θ是模型的参数向量, J i Ji Ji是第 i i i个训练样本的损失函数, η \eta η是学习率, ∂ J / ∂ θ ∂J/∂θ ∂J/∂θ是损失函数 J I JI JI对 θ θ θ的偏导数。
由于SGD每次只用一个样本来更新参数,因此相对于批梯度下降,SGD更容易陷入局部最优解,但是SGD具有更快的训练速度和更好的泛化性能。此外,SGD可以使用随机排列的训练数据,从而进一步增加训练的随机性和泛化性能。
在实际应用中,通常会采用小批量随机梯度下降(Mini-batch SGD),即每次更新参数时使用一小部分训练数据,以平衡计算效率和收敛速度的问题。此外,也可以使用带动量的随机梯度下降(Momentum SGD)和自适应学习率的随机梯度下降(Adaptive SGD)等算法来提高SGD的性能。
小批量随机梯度下降 Mini-Batch SGD
小批量随机梯度下降(Mini-Batch Stochastic Gradient Descent,Mini-batch SGD)是一种梯度下降算法,是批梯度下降和随机梯度下降的折中方案。在Mini-batch SGD中,每次更新参数时,不是使用整个训练集或单个样本的损失函数梯度,而是使用一个包含若干个训练样本的小批量(mini-batch)的梯度来更新参数。
对于包含m个样本的训练集,我们将其划分为大小为b的小批量,其中b是小于m的正整数。每个小批量中包含b个样本,算法在每个小批量上计算损失函数的梯度,并利用该梯度来更新模型参数。Mini-batch SGD的更新公式如下:
θ t + 1 = θ t − η 1 ∣ B ∣ ∑ i ∈ B ∇ θ L ( f θ ( x i ) , y i ) \theta_{t+1} = \theta_t - \eta \frac{1}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \nabla_{\theta} \mathcal{L}(f_{\theta}(x_i), y_i) θt+1=θt−η∣B∣1i∈B∑∇θL(fθ(xi),yi)
其中, θ t \theta_t θt 是在时间步 t t t 时刻的模型参数, η \eta η 是学习率, B \mathcal{B} B 是一个 mini-batch, ∣ B ∣ |\mathcal{B}| ∣B∣ 表示 mini-batch 的大小, x i x_i xi 和 y i y_i yi 分别是第 i i i 个样本的输入和输出, L \mathcal{L} L 是损失函数, f θ f_{\theta} fθ 是一个参数为 θ \theta θ 的函数,用于将输入 x i x_i xi 映射到输出 f θ ( x i ) f_{\theta}(x_i) fθ(xi), ∇ θ L ( f θ ( x i ) , y i ) \nabla_{\theta} \mathcal{L}(f_{\theta}(x_i), y_i) ∇θL(fθ(xi),yi) 是 L ( f θ ( x i ) , y i ) \mathcal{L}(f_{\theta}(x_i), y_i) L(fθ(xi),yi) 对参数 θ \theta θ 的梯度。
具体地,Mini-batch SGD的更新过程如下:
将训练数据集分成多个 mini-batch,每个 mini-batch 包含 n n n 个样本。
在每个时间步 t t t,从 mini-batch 中随机选择一个样本 x t x_t xt 和相应的标签 y t y_t yt。
计算损失函数 L ( f θ ( x t ) , y t ) \mathcal{L}(f_{\theta}(x_t), y_t) L(fθ(xt),yt) 关于模型参数 θ \theta θ 的梯度 ∇ θ L ( f θ ( x t ) , y t ) \nabla_{\theta} \mathcal{L}(f_{\theta}(x_t), y_t) ∇θL(fθ(xt),yt)。
使用梯度下降法更新模型参数: θ t + 1 = θ t − η ∇ θ L ( f θ ( x t ) , y t ) \theta_{t+1} = \theta_t - \eta \nabla_{\theta} \mathcal{L}(f_{\theta}(x_t), y_t) θt+1=θt−η∇θL(fθ(xt),yt),其中 η \eta η 是学习率。
重复执行步骤 2-4,直到达到一定的迭代次数或满足某个停止条件。
Mini-batch SGD相比于批梯度下降和随机梯度下降具有更好的性能,因为它可以在一定程度上平衡计算效率和收敛速度的问题。具体来说,Mini-batch SGD可以充分利用计算资源,同时减少随机性对训练的影响,从而可以获得更好的性能和泛化能力。
在实践中,Mini-batch SGD通常与其他优化技术一起使用,如动量法和自适应学习率方法等,以提高算法的性能。
次梯度算法Subgradients
次梯度算法是一种优化算法,主要用于求解凸函数的最小值。它是梯度下降算法的一种泛化形式,在一些特殊情况下,它可以比梯度下降算法更加有效。
在凸优化中,一个函数f(x)的次梯度是一个向量g,满足以下条件:
f ( y ) ≥ f ( x ) + g T ( y − x ) ,对于所有的 y f(y) ≥ f(x) + gT(y-x),对于所有的y f(y)≥f(x)+gT(y−x),对于所有的y
其中, g T gT gT表示 g g g的转置, x x x和 y y y是函数f的定义域内的任意两个点。
次梯度算法的基本思想是在每个迭代步骤中,选择一个次梯度 g g g,并使用 g g g来更新当前点 x x x的位置。通常,次梯度 g g g可以通过以下方式计算:
g = a r g m i n g ′ : g ′ T ( x ′ − x ) > f ( x ′ ) − f ( x ) , 对于所有的 x ′ g = argmin{g': g'T(x'-x) > f(x')-f(x)}, 对于所有的x' g=argming′:g′T(x′−x)>f(x′)−f(x),对于所有的x′
其中, x ′ x' x′是当前点 x x x周围的一组候选点。这个公式的意思是在所有能够产生下降方向的候选方向中,选择产生最大下降量的方向作为次梯度 g g g。
次梯度算法的收敛性和收敛速度都与选取次梯度的策略密切相关。在实际应用中,可以采用不同的次梯度选取策略,例如随机选取、最小次梯度、最大次梯度等。次梯度算法可以被广泛应用于机器学习、计算机视觉、自然语言处理等领域的优化问题中。
动量Momentum
动量(Momentum)是一种在机器学习中用于优化算法的方法,可以加速训练过程,并帮助算法跳出局部最优解。动量方法在梯度下降算法的基础上引入了一个历史梯度的概念,以平滑梯度的方向,从而加快参数的更新。
在梯度下降算法中,每次更新参数时,仅仅使用当前的梯度来决定更新方向和大小。而在动量方法中,我们引入了一个历史梯度 v \mathbf{v} v 来帮助决定更新方向。具体地,动量方法的参数更新公式如下:
v t = γ v t − 1 + η ∇ θ L ( f θ ( x t ) , y t ) \mathbf{v}_t = \gamma \mathbf{v}_{t-1} + \eta \nabla_{\theta} \mathcal{L}(f_{\theta}(x_t), y_t) vt=γvt−1+η∇θL(fθ(xt),yt)
θ t + 1 = θ t − v t \theta_{t+1} = \theta_t - \mathbf{v}_t θt+1=θt−vt
其中, v t \mathbf{v}t vt 是时间步 t t t 时刻的历史梯度, γ \gamma γ 是动量系数,控制历史梯度的权重大小,通常取值在 0.9 0.9 0.9 到 0.99 0.99 0.99 之间。 η \eta η 是学习率, ∇ θ L ( f θ ( x t ) , y t ) \nabla{\theta} \mathcal{L}(f_{\theta}(x_t), y_t) ∇θL(fθ(xt),yt) 是损失函数 L \mathcal{L} L 关于模型参数 θ \theta θ 的梯度。 θ t + 1 \theta_{t+1} θt+1 是更新后的模型参数。
动量方法可以使更新方向更加稳定,并且在更新方向改变的时候,可以更快地调整步长。这样可以有效地减少震荡,加快收敛速度,特别是在优化函数存在峡谷或平原的情况下。
峡谷和平原是指优化函数中存在的梯度值比较小或接近于零的区域,这些区域可能对应于函数的局部最小值,或者是一个宽阔的平坦区域。在这些区域,梯度下降算法容易陷入局部最优解或者停滞不前,因为每次迭代的更新方向都会受到当前的梯度方向的限制,导致算法难以跳出这些区域。此外,一些其他的优化算法,如AdaGrad、RMSprop、Adam等也可以对于峡谷或平原问题有较好的处理能力。
+抑制振荡
+加速度
-仍然需要学习率的衰减
Nesterov Accelerated Gradient (NAG) / Nesterov Momentum
Nesterov Accelerated Gradient (NAG),也叫 Nesterov Momentum,是一种改进版的动量方法,可以在更新方向上进行更准确的估计,从而提高优化算法的收敛速度。
与标准动量方法不同,Nesterov Momentum 在计算历史梯度时先对当前的参数 θ t \theta_t θt 进行一次更新,然后再根据更新后的参数 θ t + γ v t − 1 \theta_t + \gamma \mathbf{v}_{t-1} θt+γvt−1 计算历史梯度 v t \mathbf{v}_t vt,具体地,Nesterov Momentum 的参数更新公式如下:
v t = γ v t − 1 + η ∇ θ L ( f θ t + γ v t − 1 ( x t ) , y t ) \mathbf{v}_t = \gamma \mathbf{v}_{t-1} + \eta \nabla_{\theta} \mathcal{L}(f_{\theta_t+\gamma \mathbf{v}_{t-1}}(x_t), y_t) vt=γvt−1+η∇θL(fθt+γvt−1(xt),yt)
θ t + 1 = θ t − v t \theta_{t+1} = \theta_t - \mathbf{v}_t θt+1=θt−vt
如果令 L ( W t ) = L ( f θ ( x t ) , y t ) 如果令\mathcal{L}(W_t) = \mathcal{L}(f_{\theta}(x_t), y_t) 如果令L(Wt)=L(fθ(xt),yt)
则得到 L ( W t + γ v t − 1 ) = L ( f θ t + γ v t − 1 ( x t ) , y t ) 则得到\mathcal{L}(W_t+\gamma \mathbf{v}_{t-1}) = \mathcal{L}(f_{\theta_t+\gamma \mathbf{v}_{t-1}}(x_t), y_t) 则得到L(Wt+γvt−1)=L(fθt+γvt−1(xt),yt)
其中, γ \gamma γ 是动量系数,控制历史梯度的权重大小,通常取值在 0.9 0.9 0.9 到 0.99 0.99 0.99 之间。 η \eta η 是学习率, ∇ θ L ( f θ t + γ v t − 1 ( x t ) , y t ) \nabla_{\theta} \mathcal{L}(f_{\theta_t+\gamma \mathbf{v}_{t-1}}(x_t), y_t) ∇θL(fθt+γvt−1(xt),yt) 是损失函数 L \mathcal{L} L 关于模型参数 θ t + γ v t − 1 \theta_t + \gamma \mathbf{v}_{t-1} θt+γvt−1 的梯度。 θ t + 1 \theta_{t+1} θt+1 是更新后的模型参数。
在计算历史梯度时,Nesterov Momentum 先根据上一次的历史梯度 v t − 1 \mathbf{v}_{t-1} vt−1 对当前参数进行一次预测(即将当前参数 θ t \theta_t θt 向前推进一步,得到 θ t + γ v t − 1 \theta_t + \gamma \mathbf{v}_{t-1} θt+γvt−1),然后再计算这个预测点处的梯度。这样可以更准确地估计更新方向,从而提高算法的收敛速度。
与标准动量方法相比,Nesterov Momentum 在峡谷或平原的情况下可以更快地跳出局部最优解,收敛速度更快。
自适应梯度
我们需要计算网络中的每个参数进行单独的学习速率,对于不频繁(频繁)参数和具有小(大)梯度大小的参数需要大(小)学习率的学习率。
AdaGrad
Adagrad(Adaptive Gradient):基于梯度平方的对角矩阵,对每个参数的学习率进行自适应调整。当某个参数的梯度较大时,该参数的学习率将减小,从而使优化过程更加稳定。
g t , i = ∂ J ( θ t , i ) / ∂ θ t , i g_{t,i} = ∂J(θ_{t,i}) / ∂θ_{t,i} gt,i=∂J(θt,i)/∂θt,i
θ t + 1 , i = θ t , i − ( η ∑ k = 1 t g k , i 2 + ϵ ) ∗ g t , i θ_{t+1,i} = θ_{t,i} - ( \frac{\eta}{\sqrt{\sum_{k=1}^{t}g_{k,i}^2 + \epsilon}}) * g_{t,i} θt+1,i=θt,i−(∑k=1tgk,i2+ϵη)∗gt,i
其中, g t , i g_{t,i} gt,i表示参数 θ t , i \theta_{t,i} θt,i 在时刻 t t t 的梯度, g t , i 2 = g t , i ∗ g t , i g_{t,i}^2 = g_{t,i} * g_{t,i} gt,i2=gt,i∗gt,i, η \eta η 表示学习率, ϵ \epsilon ϵ 是为了数值稳定性而添加的小值 。 ∗ * ∗指元素级乘法
+单独学习率
-学习率下降的过于激进
RMSprop
RMSprop(Root Mean Square Propagation):对Adagrad进行改进,通过引入一个衰减因子,对历史梯度平方的加权平均进行计算,从而减小梯度平方的波动,使学习率更加稳定。
g t , i = ∂ J ( θ t , i ) / ∂ θ t , i g_{t,i} = ∂J(θ_{t,i}) / ∂θ_{t,i} gt,i=∂J(θt,i)/∂θt,i
S t , i = ρ S t − 1 , i + ( 1 − ρ ) g t , i 2 S_{t,i} = ρS_{t-1,i} + (1 - \rho)g_{t,i}^2 St,i=ρSt−1,i+(1−ρ)gt,i2
θ t + 1 , i = θ t , i − ( η S t , i + ϵ ) ∗ g t , i θ_{t+1,i} = θ_{t,i} - ( \frac{\eta}{\sqrt{S_{t,i} + \epsilon}}) * g_{t,i} θt+1,i=θt,i−(St,i+ϵη)∗gt,i
其中, S t , i S_{t,i} St,i表示参数 θ t , i \theta_{t,i} θt,i 的梯度平方的加权平均, ρ \rho ρ 表示衰减因子。
Hinton suggests ρ \rho ρ = 0.9, η \eta η = 0.001
+急剧下降是固定的
-我们还是需要去设定学习率
Adadelta
Adadelta(Adaptive Delta):通过引入一个状态变量,对Adagrad和RMSprop进行改进。Adadelta考虑到了之前梯度平方的历史信息,通过对历史信息的平均来计算参数的更新幅度,从而避免了Adagrad中学习率的单调递减问题,同时还克服了RMSprop中对学习率的手动设置的缺点。
Suggested: ρ \rho ρ = 0.95
+没有学习率
Adam
Adam(Adaptive Moment Estimation):将梯度平方的移动加权平均和梯度的移动加权平均相结合,同时考虑一阶和二阶的梯度信息,进一步优化了自适应学习率的表现。
Suggested: µ = 0.9, ρ \rho ρ = 0.999, η \eta η = 0.001
+鲁棒性
Combination w. NAG exists (“Nadam”)
AMSGrad
根据经验观察,Adam不能收敛到一个最优/好的解,因为Adam(和类似的方法)并不能保证凸问题的收敛性(原始收敛证明中的误差)。
链式法则 Chain Rule
链式法则(Chain Rule)是微积分中的一个基本公式,用于计算复合函数的导数。在神经网络中,链式法则被广泛应用于计算反向传播算法中的梯度。具体而言,设 f ( u ) f(u) f(u) 和 g ( x ) g(x) g(x) 是两个可导函数,则复合函数 h ( x ) = f ( g ( x ) ) h(x) = f(g(x)) h(x)=f(g(x)) 的导数可以表示为:
h ′ ( x ) = f ′ ( g ( x ) ) g ′ ( x ) h'(x) = f'(g(x))g'(x) h′(x)=f′(g(x))g′(x)
其中, g ′ ( x ) g'(x) g′(x) 表示函数 g ( x ) g(x) g(x) 在点 x x x 处的导数, f ′ ( u ) f'(u) f′(u) 表示函数 f ( u ) f(u) f(u) 在点 u = g ( x ) u=g(x) u=g(x) 处的导数。
在神经网络中,链式法则可以用来计算目标函数相对于网络参数的梯度,即反向传播算法中的“反向梯度传递”。链式法则的应用使得神经网络的训练变得高效和自动化,成为深度学习中的核心技术之一。
Forward pass: Compute activations
Backward pass: Recursively apply chain rule
反馈回路 Feedback Loop
如果学习率过高 → 正反馈 → 损失无限增加 exploding gradient。
如果学习率过小 → 负反馈 → 梯度消失 vanishing gradient。
学习率的选择对于深度学习非常关键。
全连接层是前馈神经网络中各层之间最通用的连接
激活函数 Activation Function
非线性激活函数可实现通用函数近似:这对于一个强大的网络来说是非常重要的。在神经网络中,激活函数是用来加入非线性特性的数学函数,它被应用在每个神经元的输出上,将输入信号转化为输出信号,用于捕捉输入的非线性特征。
Sigmoid激活函数
Sigmoid函数也称为Logistic函数,它的公式如下:
f ( x ) = 1 / ( 1 + e x p ( − x ) ) f(x) = 1 / (1 + exp(-x)) f(x)=1/(1+exp(−x))
Sigmoid函数的输出范围在0到1之间,具有非常好的可解释性,可以用来表示概率。它在一定程度上解决了神经网络的非线性问题,并且在之前的神经网络中得到了广泛的应用。但是,Sigmoid函数存在两个主要缺点:
(1)梯度消失问题:当输入值非常大或非常小的时候,Sigmoid函数的导数会趋近于0,这会导致在反向传播过程中,梯度消失的问题。
(2)输出不是以0为中心的问题:Sigmoid函数的输出范围在0到1之间,这意味着它的输出值不是以0为中心的,这可能会导致梯度的偏移和网络训练的不稳定性。
Tanh激活函数
Tanh函数也称为双曲正切函数,它的公式如下:
f ( x ) = ( e x p ( x ) − e x p ( − x ) ) / ( e x p ( x ) + e x p ( − x ) ) f(x) = (exp(x) - exp(-x)) / (exp(x) + exp(-x)) f(x)=(exp(x)−exp(−x))/(exp(x)+exp(−x))
Tanh函数的输出范围在-1到1之间,它在一定程度上解决了Sigmoid函数的输出不是以0为中心的问题。相比于Sigmoid函数,Tanh函数的导数在输入值为0附近的时候最大,这意味着它可以更好地传递梯度。
但是,Tanh函数也存在梯度消失问题,当输入值非常大或非常小的时候,Tanh函数的导数会趋近于0,这会导致在反向传播过程中,梯度消失的问题。
ReLU激活函数
ReLU函数公式如下:
f ( x ) = m a x ( 0 , x ) f(x) = max(0, x) f(x)=max(0,x)
ReLU函数的输出范围在0到正无穷之间,并且是非线性的。相比于Sigmoid函数,ReLU函数具有以下优点:
(1)解决了梯度消失问题:ReLU函数在输入值大于0的时候梯度为1,在输入值小于等于0的时候梯度为0,这使得它在反向传播时可以更好地传递梯度,解决了梯度消失问题。
(2)计算速度更快:ReLU函数的计算非常简单,只需要进行一个max操作,因此计算速度很快。
但是,ReLU函数也存在一些缺点:
(1)死亡ReLU问题:当ReLU函数的输入值小于等于0时,神经元将无法被激活,这样的神经元称为“死亡ReLU”,这可能会导致神经网络的部分输出失效。
(2)输出不是以0为中心的问题:ReLU函数在输入值小于等于0的时候梯度为0,这意味着在训练中,神经元在这些区域内不会学习任何东西,这可能会导致梯度的偏移和网络训练的不稳定性。
Leaky ReLU / Parametric ReLU
Leaky ReLU函数是ReLU函数的一种改进版本,它的公式如下:
f(x) = max(0.01x, x)
Leaky ReLU函数在输入值小于0的时候有一个小的斜率,这样可以避免ReLU函数的死亡ReLU问题。
Exponential Linear Unit (ELU)
ELU函数是一种新的激活函数,它的公式如下:
f ( x ) = { x if x > 0 α ∗ ( e x p ( x ) − 1 ) if x < = 0 f(x) =\begin{cases} x &\text{ if } x>0 \\ \alpha * (exp(x) - 1)&\text{ if } x <= 0 \end{cases} f(x)={xα∗(exp(x)−1) if x>0 if x<=0
其中, α \alpha α是一个可调参数,通常取值为1。ELU函数在输入值小于0的时候有一个小的斜率,这样可以避免ReLU函数的死亡ReLU问题。
Scaled ELU (SELU)
Scaled Exponential Linear Unit(SELU)是一种自适应激活函数,公式如下:
f ( x ) = λ { x if x > 0 α ∗ ( e x p ( x ) − 1 ) else f(x) = \lambda\begin{cases} x &\text{ if } x>0 \\ \alpha * (exp(x) - 1)&\text{ else } \end{cases} f(x)=λ{xα∗(exp(x)−1) if x>0 else
其中, λ \lambda λ和 α \alpha α是SELU函数的两个可调参数,通常取值为1.0507和1.6733。SELU函数的关键点在于它的自适应性质,当神经网络中的权重和偏置值都是从高斯分布中采样得到时,SELU函数可以保证输出值的均值和方差在网络的每一层都保持不变,这可以避免梯度消失和梯度爆炸的问题,从而提高深度神经网络的性能。
需要注意的是,SELU函数只在具有高斯分布权重和偏置的网络中表现得比较好,对于其他类型的网络,如稀疏网络等,SELU函数的表现可能并不理想。
寻找最优激活函数
寻找策略:
1.定义一个搜索空间
2.使用具有强化学习的RNN来执行搜索
3.使用最佳的效果
好的激活函数标准:
它们有线性的区域,以防止梯度消失(vanishing gradients)。
它们有饱和的区域(saturating areas)来提供非线性(non-linearity)。
它们应该是单调的(monotonic)。
卷积神经网络 (CNN)
卷积神经网络(Convolutional Neural Network,CNN)是一种专门用于处理具有类似网格结构数据的深度神经网络,其中每个神经元只与其相邻的神经元连接,这种连接方式可以大大减少神经网络的参数数量和计算复杂度,从而在处理图像、语音、文本等数据时表现出色。
CNN最初是为图像处理任务而设计的,它的基本组成部分是卷积层、池化层和全连接层。卷积层可以通过卷积核(也称为过滤器)对输入图像进行特征提取,池化层可以对特征图进行下采样(压缩和聚合信息,保存参数),从而减小特征图的大小并提高网络的鲁棒性,全连接层则可以将特征映射到具体的类别上。卷积层中的卷积核是CNN的核心部分,它可以对输入图像进行特征提取,例如边缘、纹理、颜色等,通过不断堆叠卷积层和池化层,CNN可以逐渐提取出更高层次的特征,最终实现对图像的识别和分类。
卷积层(Convolutional Layer)
卷积层是CNN的核心部分,它可以对输入数据进行卷积操作,提取图像中的特征。卷积层的输入是一个三维张量,通常是一组图像,每张图像由若干个二维卷积核滑动窗口扫描得到一个特征图。卷积核的大小和数量是CNN的超参数,不同的卷积核可以提取不同的特征,例如边缘、纹理等。
在卷积层中,卷积操作可以表示为:
y i , j = ∑ p = 0 k − 1 ∑ q = 0 k − 1 w p , q x i + p , j + q + b y_{i,j} = \sum_{p=0}^{k-1} \sum_{q=0}^{k-1} w_{p,q}x_{i+p,j+q} + b yi,j=p=0∑k−1q=0∑k−1wp,qxi+p,j+q+b
其中, x x x是输入张量, w w w是卷积核, b b b是偏置项, k k k是卷积核大小, y y y是输出特征图。
卷积层的优点是可以共享权值,减少了参数数量,从而减少过拟合风险,提高了网络的泛化能力。
填充Padding
Padding(填充)用于在进行卷积操作时在输入张量的边缘周围添加额外的值(通常是0),以便输出张量的尺寸与输入张量相同。
在卷积操作中,卷积核的大小通常小于输入张量的尺寸,这意味着卷积操作将在输入张量的边缘处丢失信息,导致输出张量的尺寸比输入张量小。为了避免这种情况,我们可以通过在输入张量的边缘周围添加填充值来扩展输入张量的尺寸,使其与输出张量的尺寸相同。
具体而言,padding通常通过在输入张量的边缘周围添加一定数量的0值来实现,这些0值不会影响卷积核的权重计算,但可以保留输入张量的边缘信息,从而使得输出张量的尺寸与输入张量相同。常用的padding方式有两种,即“valid”(不填充)和“same”(填充使得输出张量与输入张量尺寸相同)。
多通道卷积Multi-channel convolution
多通道卷积是指使用多个卷积核对多个通道的输入进行卷积操作。在进行多通道卷积时,每个通道都会使用不同的卷积核进行卷积操作,最终将各通道的卷积结果相加得到输出特征图。
具体地,在多通道卷积中,卷积核的权重张量的形状为(n_filters, n_channels, kernel_size, kernel_size),其中n_filters是输出通道数,n_channels是输入通道数,kernel_size是卷积核大小。输入张量的形状为(batch_size, n_channels, height, width),其中batch_size是输入的批量大小,n_channels是输入的通道数,height和width是输入的高度和宽度。对于每个批次中的输入张量,多通道卷积的计算过程可以概括为以下几个步骤:
1.对于每个输出通道,使用一个不同的卷积核对输入张量的每个通道进行卷积操作,并将各通道的卷积结果相加得到该输出通道的特征图。
2.重复步骤1直到计算完所有输出通道的特征图。
3.将所有输出通道的特征图按顺序组合成一个输出张量,并将其作为下一层的输入张量。
多通道卷积的主要优点是可以在不增加网络参数量的情况下,对输入数据进行更加全面、充分的特征提取,提高了卷积神经网络的表现能力和鲁棒性。
向前传递:
Input of size X × Y × S, where S is the number of input channels
H Filters with size M × N × S → fully connected across channels
Output dimensions: X × Y × H (with ‘same’ padding)
向后传递:
卷积可以表示为与矩阵W的矩阵乘法:通过使用Toeplitz matrix
Toeplitz矩阵
Toeplitz矩阵是一种非常特殊的矩阵,它的每一行(或每一列)元素都相同,并且每一行(或每一列)比上一行(或上一列)向右(或向下)移动一个单位时,元素值不变。
具体来说,一个 n × n n \times n n×n的Toeplitz矩阵可以表示为:
T = [ t 0 t − 1 t − 2 ⋯ t − n + 1 t 1 t 0 t − 1 ⋯ t − n + 2 t 2 t 1 t 0 ⋯ t − n + 3 ⋮ ⋮ ⋮ ⋱ ⋮ t n − 1 t n − 2 t n − 3 ⋯ t 0 ] T=\begin{bmatrix} t_0 &t_{-1} &t_{-2} &\cdots &t_{-n+1} \\ t_1 &t_0 &t_{-1} &\cdots &t_{-n+2} \\ t_2 &t_1 &t_0 &\cdots &t_{-n+3} \\ \vdots &\vdots &\vdots &\ddots &\vdots \\ t_{n-1} &t_{n-2} &t_{n-3} &\cdots &t_0 \end{bmatrix} T= t0t1t2⋮tn−1t−1t0t1⋮tn−2t−2t−1t0⋮tn−3⋯⋯⋯⋱⋯t−n+1t−n+2t−n+3⋮t0
其中, t 0 , t − 1 , t − 2 , . . . , t − n + 1 t_0, t_{-1}, t_{-2}, ..., t_{-n+1} t0,t−1,t−2,...,t−n+1为矩阵第一行的元素, t 1 , t 0 , t − 1 , . . . , t − n + 2 t_1, t_0, t_{-1}, ..., t_{-n+2} t1,t0,t−1,...,t−n+2为矩阵第二行的元素,以此类推。
在卷积神经网络中,我们可以使用Toeplitz矩阵来实现卷积运算,这被称为Toeplitz卷积或im2col技术。这种方法可以将卷积运算转化为矩阵乘法运算,从而可以使用高效的矩阵运算库加速计算过程。
跨步卷积Strided Convolutions
使用跨度(stride)来改变卷积核在输入上滑动的步长,可以让卷积核跳过一些输入位置,从而减少卷积运算的次数,加快计算速度。例如,如果我们使用步长为2的卷积核进行卷积运算,那么卷积核将跳过每个第二个位置,只计算每个第一个位置的点积,从而使输出张量的尺寸减半。
Strided Convolutions也可以用于降采样(downsampling)操作,例如在池化层中。在这种情况下,卷积核的大小通常是2x2或3x3,步长为2或3,这样就可以将输入张量的尺寸减半或减三分之二,从而实现降采样的效果。
膨胀/空洞卷积Dilated/Atrous Convolutions
传统的卷积操作是在输入张量上以步长为1的间隔滑动卷积核,并计算卷积核与输入张量的每个位置的点积。而Dilated/Atrous Convolutions则是在卷积核中间穿插一些间隔(通常是1),使得卷积核中的每个元素不仅能够看到相邻的元素,还可以看到更远的元素。这种操作可以通过对卷积核中的元素进行扩张(膨胀)来实现,因此也被称为膨胀卷积或空洞卷积。
**通过增加卷积核的感受野大小,Dilated/Atrous Convolutions可以捕捉更广泛的上下文信息,从而提高网络性能,特别是在处理输入尺寸较大或语义分割等任务时。**此外,使用膨胀卷积可以在不增加卷积核参数数量的情况下增加感受野,因此可以在一定程度上降低模型的复杂度。
1x1卷积 1 × 1 Convolution
1x1卷积指的是卷积核的大小为1x1的卷积操作。与传统的卷积操作不同,1x1卷积在每个通道上独立地执行卷积操作,因此也被称为通道卷积(channel-wise convolution)。通过使用1x1卷积,可以改变输入张量的通道数,从而增加或减少特征图中的通道数。此外,可以使用1x1卷积来融合特征图,将不同通道的特征图进行混合。
具体来说,1x1卷积可以看作是一种线性变换,通过对每个通道进行线性组合来生成输出张量。这种线性变换可以通过卷积核的权重和偏置来表示,可以通过反向传播来训练。
1x1卷积的一个重要应用是在深度残差网络(ResNet)中,使用1x1卷积来增加网络的非线性性和可训练性。在ResNet中,1x1卷积被用来进行特征图的通道数调整和特征的融合,以及引入额外的非线性激活函数来增加网络的表达能力。
池化层(Pooling Layer)
池化层是CNN中的另一个重要层,它可以对特征图进行下采样,减小特征图的尺寸并保留最显著的特征。池化层通常采用最大池化或平均池化,分别取池化窗口中的最大值或平均值作为输出。
池化层的优点是可以减小特征图的尺寸,减少计算量,同时可以提高网络的鲁棒性,减少过拟合风险。
Max Pooling
向前传递:
通常选择2x2或者3x3邻域
池化的步长通常等于邻域的尺寸
最大传播增加了额外的非线性
向后传递:
错误只沿着最大值的路径传播
全连接层(Fully Connected Layer)
全连接层是CNN的最后一层,它可以将特征映射到具体的类别上。全连接层的输入是一个一维张量,通常是经过卷积层和池化层后展开得到的特征向量,输出是一个概率向量,表示每个类别的概率。全连接层的参数数量很多,容易导致过拟合风险,因此通常采用正则化方法(如Dropout)来缓解这个问题。
综上所述,卷积层、池化层和全连接层是CNN的三个基本层,它们分别负责提取特征、下采样和分类。在实际应用中,还可以通过堆叠多个卷积层和池化层来逐步提取更高层次的特征。
正则化 Regularization
Bias Variance Tradeoff
同时优化偏差和方差一般是不可能的
我们可以通过的模型容量来减少偏差,容量的模型它可以近似为函数的种类。方差可以通过使用更多的训练数据来优化。我们可以用向上的偏差来代替向下的方差。
我们怎样能找到这样一个有利的权衡呢?通过执行先验知识(prior knowledge)。
例如数据增强,调整结构,调整训练过程,预处理
经典技术
1.测试集不能拿来训练
2.从训练数据中分割验证集
3.使用具有验证损失最小的参数
数据增强Data Augmentation
- 随机空间变换 random spatial transformations:
- 仿射变换 affine transformations
- 弹性变换 elastic transformations
- … 像素变换 pixel transformations
- 改变分辨率 changing resolution
- 随机噪声 random noise
- 改变像素分布changing pixel distribution
损失函数中的正则化
最大后验估计(Maximum A Posteriori Estimation, MAP)是一种统计学习方法,用于在已知先验概率分布的情况下,求解参数估计问题。
归一化Normalization
Normalization(归一化)是一种对数据进行预处理的方法,通常用于将数据调整为0到1之间的范围,或者将其标准化为均值为0,方差为1的分布。Normalization可以帮助加速训练过程,改善梯度传播的稳定性,并提高模型的泛化能力。
仅使用训练数据来计算归一化!
Batch Normalization(批归一化)
在神经网络的每一层的输入上应用Normalization,以使得每个Batch中的数据在统计上更加稳定。Batch Normalization不仅可以提高模型的泛化能力,还可以减轻梯度消失的问题。
对于每个Batch中的样本 x ( 1 ) , x ( 2 ) , . . . , x ( m ) x^{(1)}, x^{(2)},..., x^{(m)} x(1),x(2),...,x(m),Batch Normalization的公式为:
x ^ ( i ) = x ( i ) − μ B σ B 2 + ϵ \hat{x} ^{(i)}=\frac{x ^{(i)}-\mu B}{\sqrt{\sigma_B^2 + \epsilon} } x^(i)=σB2+ϵx(i)−μB
其中, μ B \mu_B μB和 σ B 2 \sigma_B^2 σB2分别为Batch中样本的均值和方差, ϵ \epsilon ϵ是一个小常量,避免分母为0的情况。 x ^ ( i ) \hat{x}^{(i)} x^(i)是BN后的样本。
BN还引入了可学习的参数 γ \gamma γ和 β \beta β,以便网络可以调整每个BN后的样本的缩放和平移。BN的输出为:
y ( i ) = γ x ^ ( i ) + β y ^{(i)} = \gamma \hat{x} ^{(i)} + \beta y(i)=γx^(i)+β
BN减少了内部协变量的移位;
即使BN之后再次引入内部协变量移位,也有帮助;
BN平滑了损失的景观;
BN提高了损失函数和梯度的活力;
BN提高了稳定性,例如在超参数、初始化、收敛性等方面
内部协变量偏移Internal Covariate Shift
原因:1.ReLU不是零中心的
2.初始化和输入分布可能无法规范化
3.输入分布随时间而变化
另外还有
Layer Normalization(层归一化):在神经网络的每一层的输出上应用Normalization,以使得每个样本在统计上更加稳定。
Group Normalization(组归一化):将特征分组,每组特征进行Normalization。
Instance Normalization(实例归一化):在通道的维度上进行Normalization,而不是Batch的维度上。适用于图像处理任务,例如图像风格转换。
Normalization方法的选择取决于具体任务和数据分布。虽然Normalization可以提高模型的性能,但不当的使用也会导致模型性能下降,因此需要根据具体情况进行选择和调整。
自正则化神经网络(SNN)
自正则化神经网络(Self Normalizing Neural Networks,简称SNN)是一种深度神经网络结构,旨在解决神经网络中常见的梯度消失或梯度爆炸的问题,同时也可以提高训练效率和性能。
SNN 的核心思想是使用一种特殊的激活函数,称为Swish Function,这个函数可以在训练过程中自我正则化,从而避免梯度消失和梯度爆炸的问题。SNN 还使用了一种称为“高斯单位正则化”(Gaussian Unit Normalization,简称GUN)的技术,通过对网络中的每一层进行特定的归一化操作,来进一步增强自我正则化的效果。
SNN 的优点在于它们能够更快地训练,需要更少的数据和参数,并且在某些任务上可以实现更好的性能,尤其是对于一些具有高噪声、高维度和复杂分布数据的任务。
Dropout
Dropout是一种正则化技术,用于减少深度神经网络中的过拟合问题。在训练期间,Dropout会按照一定的概率(通常为0.5)随机丢弃网络中的某些节点及其对应的连接,也就是将它们的输出设置为0。这样做可以使每个节点都有一定的概率被丢弃,从而使得网络不能过度依赖某些节点,从而达到减少过拟合的目的。
Dropout被广泛应用于深度神经网络的训练中,可以有效地减少模型的过拟合,提高模型的泛化能力。不过需要注意的是,在测试时不需要使用Dropout,需要将所有的节点都连接起来进行前向传播。
初始化 initialization
它适用于所有的非凸问题:具有非线性的神经网络通常是非凸的。
- 偏差Bias:
- 偏差单位可以简单地初始化为零
- 使用ReLU,一个小的正常数(0.1)更好,因为即将死亡的ReLU问题
- … 权重
- 权重需要是随机的才能打破对称性
- 用零初始化权重会得到很糟糕的结果,因为梯度是零!
- 与学习率相似,它们的方差会影响学习的稳定性
Xavier initialization
Xavier initialization 的基本思想是根据前一层的输入节点数和后一层的输出节点数来确定每个权重的初始值。具体而言,对于每个权重,它的初始值被设**置为一个从均值为0,方差为2/(输入节点数+输出节点数)的正态分布中随机采样的值。**这个公式是从激活函数的导数和权重更新的方差角度来推导的,可以使权重的初始值更加均匀地分布在整个神经网络中。
Xavier initialization 被广泛应用于深度神经网络中,可以提高模型的训练效率和性能,避免了权重初始化不当所带来的问题。值得注意的是,Xavier initialization 仅适用于某些激活函数(例如sigmoid和tanh),而对于其他激活函数(例如ReLU)可能需要进行一些特殊的处理。
He initialization
He initialization 的基本思想是,根据前一层的输入节点数来确定每个权重的初始值。具体而言,对于每个权重,它的初始值被设置为一个从均值为0,方差为2/输入节点数的正态分布中随机采样的值。这个公式是从ReLU激活函数的导数和权重更新的方差角度来推导的,可以使权重的初始值更加适合ReLU激活函数的性质。
He initialization 被广泛应用于深度神经网络中,可以提高模型的训练效率和性能,避免了权重初始化不当所带来的问题。与Xavier initialization不同的是,He initialization更适合于ReLU激活函数,而在其他激活函数(例如sigmoid和tanh)中,可能需要进行一些特殊的处理。
迁移学习 Transfer Learning
迁移学习是指将已经在一个任务上训练好的模型(称为“源模型”)应用于另一个任务上的技术。在深度学习中,这种技术非常有用,因为许多任务之间存在共性,即它们涉及到相似的特征提取或分类问题,因此已经在一个任务上训练好的模型可以通过迁移学习的方式用于另一个任务上,从而加快模型的训练速度和提高模型的准确性。
具体而言,迁移学习通常包括以下步骤:
1.选择一个在某个任务上表现良好的源模型;
2.将源模型的权重应用于目标模型中,通常是将源模型的前几层固定住,只训练目标模型的后几层;
3.对目标模型进行微调,即在目标任务上继续训练模型,调整一些权重参数以适应目标任务的特性;
4.如果需要,可以对目标模型进行进一步的调整,以提高模型的准确性。
相比于从头开始训练一个模型,迁移学习可以大大缩短模型的训练时间,同时提高模型的准确性。
多任务学习 Multi-Task Learning
多任务学习是指在一个模型中同时训练多个任务的技术。**在多任务学习中,模型通常由共享的底层网络和各自独立的任务特定的上层网络组成。**底层网络用于提取输入数据的共同特征,而上层网络则针对每个任务进行特定的处理。通过这种方式,底层网络可以在不同的任务之间共享特征,从而提高模型的泛化能力和准确性。
多任务学习通常涉及到以下几个方面:
1.确定任务之间的相关性:多任务学习只有在不同的任务之间存在相关性时才能发挥作用。因此,需要对不同任务之间的关系进行分析,以确定是否适合使用多任务学习。
2.确定共享底层网络:共享底层网络是多任务学习的核心,因为它可以在不同的任务之间共享特征。因此,需要选择一个适合的底层网络,以提取输入数据的共同特征。
3.确定上层网络:上层网络通常是任务特定的,因为不同的任务通常需要不同的处理方式。因此,需要设计适合不同任务的上层网络结构。
4.训练多任务模型:最后,需要在多任务模型中同时训练多个任务。通常采用交替优化的方式,即在每次迭代中随机选择一个任务进行训练,并更新该任务的上层网络和底层网络。
相比于单任务学习,多任务学习可以提高模型的效率和准确性,尤其是当不同的任务之间存在相关性时。
开始训练
训练之前
- 梯度检查:
- 设计自己的损失函数,自己的图层实现等。:通过比较解析梯度和数值梯度,验证梯度的正确计算。
- 对数值渐变使用中心差异。
- 使用双精度进行检查。
- 使用相对的误差,而不是绝对的误差。
- 如果你观察到非常小的值(< 1e−9),暂时使用尺度损失函数。
- 只使用几个数据点:减少损失函数中不可微部分的问题。
- 在执行梯度检查之前,对网络进行短期训练。
- 首先在没有正则化时检查梯度,然后再用正则化。
- 先不要数据增强和dropout. 初始化和损失函数检查
- 关闭正则化并计算未训练网络上每个类的损失。
- 比较一下在随机决定一个类时所获得的损失。
- 使用多个随机初始化进行重复操作。 初始化和损失函数检查
- 在完整的训练数据集上训练网络之前,取一个小子集(5-20个样本),尝试对网络进行过拟合以得到零损失。
- 注释可能会阻碍过拟合的正则化操作
- 如果网络不能过拟合:
1.有BUG;
2.模型太小:需要增加参数的数量
3.模型不适合执行该任务
训练中
- 监控损失函数:
- 检查学习率。
- 识别学习曲线中的较大的跳跃。
- 如果曲线充满噪声,应该增加 batch size。 监控验证损失
- 如果训练损失曲线和验证损失曲线偏离:过拟合:增加正则化/提前停止。
- 如果训练和验证损失接近但很高:不拟合:减少正则化/增加模型大小 监控权重和激活函数
- 跟踪权重更新的相对大小:应该在一个合理的范围内(大约1e-3)。
- 卷积层:检查前几个层的过滤器,应发展为光滑和常规的过滤器。
- 检查是否有非常大或饱和激活(:死亡ReLUs)。
优化方法选择
Start with Mini-Batch SGD + momentum.
频繁、更稳定的更新;
梯度噪声大到足以逃避局部最小值;
适应小批量大小产生更平滑/更嘈杂的梯度;
增加动量可以防止振荡和加速优化;
为了更快的收敛速度,可以使用Adam
学习率 η η η对网络训练的成功与否有很大的影响。如果我们想要一个自适应学习率:逐步的更小的步骤来找到最优——>退火的学习率
学习率 η η η的衰减策略
逐步衰减:每n个epoch,将学习率降低一个确定的参数指如0.5,或一个恒定值如0.01。
指数衰减:在epoch t:η=η0e(-kt)由k控制衰减。
1/t-衰减:在epoch t:η=η0/(1+kt)
Hyperparameter优化
- 架构:
- 层数和每层的节点数
- 激活函数。
- 。。。 优化
- 初始化
- 损失函数
:优化器(SGD,动量,ADAM,……) - 学习率,衰减和批量大小
: 。。。 正则化 - 正则器,如L2、L1损耗
- 批归一化?
- Dropout?
: 。。。
评价
多类分类 Multiclass classification:
Top-K error:True类标签不在预测得分最高的K个类中。一般使用Top-5 error和Top-5 error。例如ImageNet的性能通常用Top-5 error来衡量。
交叉验证 Cross Validation:
在交叉验证过程中,将数据集分为训练集和测试集,然后对模型进行多次训练和测试。每次训练使用不同的训练数据集,每次测试使用不同的测试数据集,以便得出模型在不同数据集上的性能。
常用的交叉验证方法包括K折交叉验证和留一交叉验证。K折交叉验证将数据集分为K个互不重叠的子集,然后进行K次训练和测试,每次使用其中一个子集作为测试集,其余子集作为训练集。留一交叉验证是一种特殊的K折交叉验证,将每个样本单独作为测试集,其余样本作为训练集,进行n次训练和测试。
交叉验证可以避免模型在特定数据集上的过拟合或欠拟合,同时还可以提供对模型泛化能力的评估。交叉验证还可以帮助选择合适的模型和超参数,以提高模型性能。
Bonferroni校正(Bonferroni Correction)
这是一种多重比较校正方法,旨在减少在多次比较中发生错误的概率。多重比较指的是在进行多个统计检验或估计多个参数时,进行多次假设检验或参数估计。
在进行多次比较时,如果不进行校正,错误发生的概率会随着比较次数的增加而增加。Bonferroni校正的基本思想是将所需的显著性水平除以比较的次数,以保持整体错误率不超过给定的显著性水平。
例如,在进行10次比较时,如果希望整体错误率不超过0.05,那么每次比较的显著性水平需要调整为0.005(即0.05/10)。
Bonferroni校正是一种简单而广泛使用的多重比较校正方法,但其主要缺点是在比较次数较多时,可能会过于保守,导致失去一些有用的统计信息。因此,也有其他更复杂的多重比较校正方法,如FDR校正和Holm校正等,可根据具体情况选择使用。
架构Architectures
早期架构Early Architectures
LeNet-5
LeNet-5是一种经典的卷积神经网络,由Yann LeCun在1998年提出,用于手写数字识别。它是第一个成功应用于实际问题的卷积神经网络,并为后来的深度学习发展奠定了基础。LeNet-5的主要特点如下:
卷积操作:LeNet-5首次引入了卷积操作,通过局部连接和权值共享来减少需要训练的参数数量,提高了网络的泛化性能。
池化操作:LeNet-5使用了池化操作,通过对局部区域进行下采样来减小特征图的大小,并且可以使特征对位置变化不敏感,提高了网络的鲁棒性。
激活函数:LeNet-5使用了sigmoid作为激活函数,它可以将神经元的输出限制在0和1之间,使得神经元输出具有概率意义。
层次结构:LeNet-5的网络结构是由卷积层、池化层和全连接层组成的,这种层次结构可以有效地提取输入数据的不同层次的特征。
前馈结构:LeNet-5是一种前馈结构的神经网络,即每个神经元的输出只依赖于它的输入,不依赖于后续的神经元,这种结构使得网络的训练过程更加稳定和高效。
总之,LeNet-5的主要特点是卷积操作、池化操作、多层次特征提取、前馈结构和适用于图像识别。
AlexNet
AlexNet是一种卷积神经网络,由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton在2012年提出,是深度学习中一个重要的里程碑。它在ImageNet竞赛中取得了极高的成绩,具有以下主要特点和功能:
深度神经网络结构:AlexNet是一个深度神经网络,由8层神经元组成。其中,前5层为卷积层,后3层为全连接层。这种深度结构可以对输入的数据进行多层次的特征提取和分类。
并行计算:AlexNet在两个GPU上并行运算,大大提高了训练速度。
ReLU激活函数:AlexNet首次使用ReLU(Rectified Linear Unit)作为激活函数,这种函数在处理大规模数据时可以提高神经网络的训练速度。
Dropout:AlexNet首次使用Dropout来防止过拟合,这种方法可以在训练过程中随机地将一部分神经元设置为0,从而防止神经网络过度拟合训练数据。
数据增强:AlexNet使用了数据增强技术,通过在训练数据中进行随机裁剪、水平翻转、颜色变换等操作来扩充训练数据集,增加了模型的鲁棒性。
Softmax分类器:AlexNet使用Softmax分类器对特征进行分类,该分类器可以将特征向量映射为概率分布,从而得到更准确的分类结果。
综上所述,AlexNet的主要特点和功能是深度神经网络结构、并行计算、ReLU激活函数、Dropout、数据增强、Softmax分类器和大规模数据集训练。
VGG Network
VGG网络是由牛津大学的Karen Simonyan和Andrew Zisserman在2014年提出的卷积神经网络:
极深的网络结构:VGG网络采用深度网络结构,由16-19层卷积层和全连接层组成。其网络深度和卷积核大小相对较小,采用更多的卷积层来提高特征的抽象程度,从而在图像识别和分类任务上取得了优异的性能。
小卷积核:VGG网络的卷积核大小都为3x3,这种大小相对较小的卷积核可以用更少的参数提取更丰富的特征,并且可以避免过拟合的问题。
综上所述,VGG网络的主要特点和功能是极深的网络结构、小卷积核、池化层、非线性激活函数、Batch Normalization、Dropout和大规模数据集训练。
GoogleNet
GoogleNet是由Google公司的研究员在2014年提出的卷积神经网络:
Inception结构:GoogleNet使用了一种名为Inception的网络结构,该结构使用了多个不同大小的卷积核来提取不同尺度的特征,从而增加了网络的宽度和深度,并且可以提高图像分类的准确度。
平均池化层:GoogleNet使用了全局平均池化层来代替传统的全连接层,这种层可以将每个特征图压缩成一个单独的数值,从而可以减小网络的参数量和计算复杂度,并且可以避免过拟合的问题。
1x1卷积核:GoogleNet使用了1x1的卷积核来减少网络的计算量和参数量,同时可以增强网络的非线性表达能力。
多分支结构:GoogleNet使用了多个Inception模块,并且每个Inception模块内部都包含了多个分支,这种结构可以增加网络的宽度和深度,并且可以提高图像分类的准确度。
辅助分类器:GoogleNet使用了辅助分类器来增强网络的训练效果,这些辅助分类器可以在中间层对特征进行分类,并且可以提供额外的梯度信号,从而加速网络的训练。
综上所述,GoogleNet的主要特点和功能是Inception结构、平均池化层、1x1卷积核、多分支结构、Dropout和辅助分类器。
退化
原因:激活函数和梯度的不良传播
梯度消失问题:
——>ReLUs
——>正确的初始化
内部协变量移位:
——>Batch normalization
——>ELU / SELU
解决方法: Residual Units
Residual Units是指深度残差网络(ResNet)中的一种基本模块,它能够帮助解决深度卷积神经网络中的梯度消失和模型退化问题。Residual Units的设计是基于残差学习的思想,即对于一个网络的层,其输出应该是当前层的输入加上一个残差项,即输出-输入,从而实现信息的跨层传递。
具体来说,Residual Units是由两个卷积层组成的模块,其中第一个卷积层用于提取特征,第二个卷积层用于学习残差。Residual Units的输出是当前层的输入加上学习到的残差,这样可以避免梯度消失的问题,从而加速网络的训练,并且可以更容易地训练非常深的网络。
在实际应用中,Residual Units通常使用跨层连接来实现信息的跨层传递。这种连接方式可以分为两种,一种是直接连接,即将当前层的输入直接加到当前层的输出中,另一种是使用1x1卷积进行映射,即通过一个1x1的卷积层将当前层的输入映射为与当前层输出具有相同的通道数,再将映射后的输入加到当前层的输出中。
ResNet
ResNet是一种深度残差网络(Deep Residual Network)结构,由微软研究院的Kaiming He等人在2015年提出,广泛应用于图像识别、物体检测、语义分割等计算机视觉领域。ResNet最主要的特点是使用残差块(Residual Block)进行特征提取和学习,可以有效缓解网络退化问题和过拟合问题,提高网络的深度和性能
残差块:ResNet使用了残差块(Residual Block)进行特征提取和学习。残差块可以让网络在学习目标函数的同时,学习残差(Residual),通过将残差与输入相加来更新特征,可以使网络更容易训练,加速收敛,提高模型的准确度。
深度网络:ResNet可以通过堆叠残差块来构建深度网络,网络的深度可以达到数百层,比传统的卷积神经网络要深得多,从而提高网络的表示能力和学习能力。
平滑连接:ResNet采用了平滑连接(Skip Connection),即在不同的层之间建立直接的连接,这种连接可以将信息从低层传递到高层,缓解梯度消失问题,并提高网络的深度和性能。
参数少:ResNet相比其他网络结构,在相同准确率的前提下,需要更少的参数,从而使得训练更加高效。
总之,ResNet是一种深度残差网络,通过使用残差块、深度网络、平滑连接等技术,可以有效缓解网络退化问题和过拟合问题,提高网络的深度和性能。
ResNeXt
ResNeXt是一种深度残差网络(ResNet)的变体,它是由微软研究院提出的一种高效的深度卷积神经网络结构,可以用于图像分类、目标检测和语义分割等任务。与传统的ResNet相比,ResNeXt在结构上进行了改进,采用了一种新的模块化设计,使得网络的参数量更小、计算效率更高,并且在一些图像分类任务上取得了更好的性能:
模块化设计:ResNeXt将网络分成多个相互独立的模块,每个模块包含若干个分支,每个分支都是由多个相同的卷积层组成。这种模块化的设计可以提高网络的可扩展性,同时还可以减少模型的参数量和计算量。
平衡的分支结构:ResNeXt中的每个模块都包含多个平衡的分支,每个分支都由多个卷积层组成。这种平衡的分支结构可以提高网络的特征表示能力,从而提高模型的准确度和泛化能力。
残差连接:ResNeXt中采用了残差连接的方式,即每个模块的输出是当前模块的输入加上学习到的残差。这种残差连接可以避免梯度消失的问题,从而加速网络的训练。
瓶颈结构:ResNeXt中采用了瓶颈结构,即将3x3卷积操作拆分为两个1x1卷积操作和一个3x3卷积操作,以降低网络的计算复杂度。
DenseNets
DenseNet是一种密集连接卷积神经网络(Densely Connected Convolutional Networks),由2017年CVPR Best Paper Award获得者Kaiming He等人提出。DenseNet的主要特点是在每一层中将前面所有层的特征图串联起来,并将它们作为输入,从而增加了信息流动,减少了信息丢失,提高了网络的性能和稳定性:
密集连接:DenseNet采用了密集连接(Dense Connection),即每一层的输入包括前面所有层的特征图,从而增加了信息流动,减少了信息丢失。这种密集连接可以让网络更加深入地挖掘数据的相关性,提高特征的复用和共享,进而提高网络的性能和稳定性。
防止梯度消失:由于特征图的信息可以在所有层之间直接传递,因此DenseNet可以有效地防止梯度消失问题(Vanishing Gradient Problem),加速训练,提高模型的准确度。
参数共享:由于DenseNet中所有层都共享参数,因此可以减少模型的参数数量,提高模型的训练效率。
大规模训练:DenseNet可以使用更少的参数来构建更深的网络,从而可以在更小的计算资源下进行大规模训练,适用于处理大规模图像数据集。
总之,DenseNet是一种密集连接卷积神经网络,通过密集连接、防止梯度消失、参数共享等技术,可以提高网络的性能和稳定性,适用于处理大规模图像数据集。
SENet
SENet(Squeeze-and-Excitation Network)是一种基于注意力机制(Attention Mechanism)的卷积神经网络,由2018年CVPR Best Paper Award获得者Jie Hu等人提出。SENet的主要特点是引入了一种新的注意力机制,即Squeeze-and-Excitation(SE)模块,通过自适应地调整通道权重来提高网络的性能和准确度:
Squeeze-and-Excitation模块:SENet引入了一种新的注意力机制,即Squeeze-and-Excitation(SE)模块。SE模块的核心思想是将每个通道的特征图进行全局池化,然后通过两个全连接层来自适应地调整通道的权重。这种自适应的调整可以让网络更加关注重要的特征,减少对不重要的特征的关注,提高网络的性能和准确度。
可插拔式设计:SENet的SE模块是一种可插拔式设计,可以很容易地嵌入到其他卷积神经网络中,如ResNet、Inception等,提高它们的性能和准确度。
基于通道的注意力机制:SENet的SE模块是一种基于通道的注意力机制,与其他注意力机制(如空间注意力机制)相比,更加轻量级,适用于处理大规模图像数据集。
递归神经网络 RNN
循环神经网络(Recurrent Neural Network,RNN)是一种特殊的神经网络,主要用于处理时序数据。与前馈神经网络(Feedforward Neural Network)不同,RNN具有反馈循环连接(Feedback Loop),使其能够在处理序列数据时维持一定的记忆能力。
RNN的主要特点是在处理序列数据时,使用了循环结构来处理时间序列上的每个时刻,每个时刻的输出与前面时刻的状态有关。这种循环结构使得RNN能够处理任意长度的序列数据,并具有较强的语言模型能力,可以用于自然语言处理、语音识别、机器翻译、图像描述生成等领域。
RNN的基本结构是循环单元(Recurrent Unit),它具有一个输入x和一个输出h,并且具有一个隐藏状态(Hidden State) h t h_t ht,表示时刻t的状态,该状态会随着时间步的变化而更新。循环单元中的参数在每个时间步被共享,这意味着循环单元对于序列中每个时刻都是相同的。在每个时间步,循环单元会根据当前的输入和前一个时间步的状态,计算出当前时间步的状态和输出。在RNN中,通常采用的是LSTM(Long Short-Term Memory)或GRU(Gated Recurrent Unit)等类型的循环单元,这些循环单元通过门控机制,能够有效地解决梯度消失和梯度爆炸的问题,并能够学习长期依赖关系。
BPTT
在RNN中,每个时间步都有一个隐藏状态,它是该时间步输入和前面时间步的隐藏状态的函数。BPTT将误差沿着时间步展开,然后使用标准反向传播算法计算每个时间步的梯度。这意味着,误差的影响会在每个时间步上反向传播,以计算网络权重的更新。
BPTT的主要优点是,它允许RNN处理变长的序列输入,同时可以在序列中学习长期的依赖关系。但是,BPTT也存在一些缺点。由于误差在时间步上的展开,BPTT在长序列上容易出现梯度消失和爆炸的问题。此外,BPTT需要存储整个序列的中间结果,这会占用大量内存,并且随着序列长度的增加,计算成本也会急剧增加。
TBPTT
TBPTT(Truncated Backpropagation Through Time)是BPTT的一种变体,旨在解决BPTT的一些缺点。
与BPTT不同,TBPTT将序列分成固定大小的块,并且每个块都进行前向传递和反向传播。这使得TBPTT只需要存储每个块的中间结果,而不是整个序列的结果,从而减少了内存消耗。尽管TBPTT是一种有效的算法,但在处理长序列时,仍然可能会出现梯度消失或爆炸的问题。
Long Short-Term Memory Units
Long Short-Term Memory Units(LSTM)是一种常用于处理序列数据的循环神经网络(RNN)的特殊类型。LSTM单元旨在解决标准RNN面临的长期依赖问题,从而能够更好地捕捉序列中的长期依赖关系。
在LSTM中,每个时间步都有三个门(输入门、遗忘门和输出门),它们控制着信息流的进出。输入门允许选择性地更新状态,遗忘门允许选择性地忘记先前的状态,输出门允许选择性地读取状态。此外,LSTM还使用单元状态来传递信息,并且可以在训练期间自适应地学习何时打开和关闭门。
相比于标准RNN,LSTM具有更强的建模能力,能够在处理长序列时更好地捕捉长期依赖关系。LSTM也在许多自然语言处理任务中表现出色,如语言建模、机器翻译和语音识别。
Gated Recurrent Units
Gated Recurrent Units(GRU)是一种类似于LSTM的循环神经网络(RNN),可以用于处理序列数据。GRU单元旨在解决标准RNN面临的长期依赖问题,同时相对于LSTM有更少的参数。
与LSTM类似,GRU单元也具有状态和门机制,可以控制信息的流动。GRU单元包含重置门和更新门,以及单个状态向量。重置门用于控制何时丢弃之前的状态,而更新门用于控制何时使用新的输入数据。
相对于LSTM,GRU仅使用两个门而不是三个门,因此具有更少的参数。此外,GRU通常也比LSTM计算更快,因为GRU单元的更新方式更简单。
虽然LSTM和GRU都可以用于处理序列数据,但在实践中,它们的性能通常取决于具体的任务和数据集。因此,研究人员通常会尝试多种不同类型的RNN单元,以找到最适合特定任务的架构。
LSTM | GRU |
---|---|
Seperate hidden and cell state | Combined hidden and cell state |
Controlled exposure of memory content through output gate | Full exposure of memory content without control |
New memory content independentof current memory | New memory content depends on current memory |
Attention
Attention用于将输入序列中不同位置的信息赋予不同的重要性权重,以便在序列到序列的任务中更好地捕捉关键信息。
具体来说,Attention机制将当前时刻的模型状态与输入序列中的每个位置进行比较,并计算每个位置的注意力分数。然后,将注意力分数乘以输入序列中对应位置的特征向量,得到加权后的向量表示,作为当前时刻的上下文向量。该上下文向量与当前时刻的模型状态一起被送入下一时刻的模型进行预测。
深度强化学习 Deep Reinforcement Learning
Multi-armed bandit problem
Multi-armed bandit problem是指在有限的时间内,需要从多个可选的动作(“arms”)中选择一个来最大化累积奖励的问题。该问题源于在赌场玩老虎机的情景中,每台老虎机都是一个"arm",玩家需要决定玩哪台老虎机来最大化获利。
在机器学习中,Multi-armed bandit problem通常被用来描述在强化学习任务中的探索-利用权衡问题。在探索阶段,代理需要探索不同的动作,以了解它们的奖励情况;在利用阶段,代理应该选择已知奖励较高的动作来最大化收益。但是,探索和利用是一个权衡问题,因为过多的探索可能导致代理无法充分利用已知的高奖励动作,而过多的利用可能导致代理无法发现更高奖励的动作。
解决Multi-armed bandit problem的方法有很多,包括Epsilon-Greedy算法、Softmax算法、Upper Confidence Bound (UCB)算法等。这些方法都旨在在探索和利用之间达到平衡,并最大化累积奖励。
最大预期奖励
最大预期奖励是指代理在执行某个动作后可以获得的期望奖励的最大值。在强化学习中,一个代理的目标是通过执行动作来最大化累积奖励,而最大预期奖励是代理在执行动作时可以预期获得的奖励的一个度量。
在Multi-armed bandit problem中,最大预期奖励通常用于选择一个动作来执行。具体地说,代理会估计每个动作的最大预期奖励,然后选择具有最大预期奖励的动作来执行。这种选择策略旨在最大化累积奖励。
利用 Exploitation
Exploitation指的是代理利用已知的知识来最大化当前的累积奖励,即代理选择已经知道可以获得高奖励的动作来执行,从而最大化累积奖励。Exploitation通常会导致代理在已知领域表现良好,但在未知领域表现较差。
探索 Exploration
Exploration指的是代理通过选择未知的动作来探索环境,以发现新的奖励和信息。Exploration通常会导致代理在未知领域表现良好,但在已知领域表现较差。因此,在学习和决策中,代理需要权衡探索和利用,并且需要根据当前的知识状态和环境来调整其策略。
在强化学习中,一个主要的挑战就是如何在探索和利用之间找到一个合适的平衡点。如果代理太注重Exploitation,可能会错过更高的奖励,而如果代理太注重Exploration,可能会耗费过多的时间和资源来探索未知领域。因此,找到合适的探索和利用策略是强化学习中的一个重要课题。
Markov Decision Process
Markov Decision Process (MDP) 是一种数学框架,用于描述强化学习问题的形式化定义。它是一个四元组 ( S , A , R , T ) (S,A,R,T) (S,A,R,T),其中:
S S S 是一个状态集合,代表着系统可能的状态。
A A A 是一个动作集合,代表着智能体可能的动作。
R R R 是一个奖励函数,指定了智能体在特定状态和采取特定动作时获得的奖励值。
T T T 是一个状态转移函数,指定了在特定状态下采取特定动作的情况下,下一个状态的概率分布。
在 MDP 中,智能体通过选择动作来控制环境。它的目标是在时间的累积中最大化预期奖励。通过在 MDP 中执行一系列动作,智能体可以改变状态并收集奖励。智能体的策略指定了在给定状态下应该采取哪些动作,而价值函数指定了智能体在给定状态下采取特定策略的预期奖励。
Policy Iteration
Policy Iteration 是强化学习中一种常见的求解最优策略的方法。它包含两个主要步骤:
策略评估(Policy Evaluation):在当前策略下,计算每个状态的价值函数,即从该状态出发,按照当前策略执行动作,得到的预期回报值。可以使用动态规划算法(如贝尔曼方程)来进行策略评估。
策略改进(Policy Improvement):根据当前的状态价值函数,生成一个新的策略。新策略的产生方式是,对于每个状态,选择在该状态下可以获得最大价值的动作。生成的新策略可能与原来的策略相同,或者更优。
在 Policy Iteration 中,上述两个步骤交替进行,直到收敛为止。策略评估和策略改进相互作用,通过反复迭代,逐步提高策略的性能。最终得到的策略是最优的,即能够最大化预期回报的策略。
无监督深度学习Unsupervised Deep Learning
弱监督学习:针对相关任务的标签
半监督学习:部分(一般很少)标记数据
无监督学习:无标记数据
Restricted Boltzmann Machine
Restricted Boltzmann Machine(RBM)是一种基于概率模型的无向图模型,通常被用于无监督学习任务中,如特征提取、降维、协同过滤等。它是Boltzmann Machine(BM)的一个特殊形式,因为它的网络结构中只有一层可见层和一层隐藏层,且这两层之间没有连接。
RBM 由许多可见节点和隐藏节点组成。可见节点表示输入数据,隐藏节点表示数据的潜在特征。这些节点通过权重连接起来,形成一个双层的神经网络。RBM 可以自动学习数据中的特征,并用学习到的特征重构输入数据。
RBM 可以看作是一个能量模型,其中每个状态都有一个能量值。对于给定的可见节点和隐藏节点状态,RBM 能够计算出该状态的能量。通过定义一个Boltzmann分布,我们可以将这个能量值映射为一个概率分布,表示该状态被采样的概率。
RBM 可以通过反向传播算法来训练。训练过程中,我们尝试最小化训练数据的负对数似然函数。具体地,我们通过 Gibbs sampling 算法来抽取样本,并利用 Contrastive Divergence算法来更新网络权重,直到收敛为止。在训练完成之后,我们可以利用训练好的 RBM 来提取特征或生成新的数据。
Autoencoder
自编码器(Autoencoder)一个编码器和一个解码器组成,其中编码器将输入数据转换为一种内部表示形式,解码器则将该内部表示形式转换回原始输入数据。
自编码器的训练过程涉及最小化输入数据和解码器输出之间的重构误差,通过调整编码器和解码器的权重来实现。这样,自编码器可以学习输入数据的紧凑表示形式,并从中提取出数据的关键特征。
自动编码器变体
卷积自动编码器:
用卷积层替换完全连接的层(可选地添加池化层)
去噪自动编码器(DAE):
堆叠自动编码器:
变分自编码器 VAE
变分自编码器(Variational Autoencoder,VAE)是一种自编码器,通过潜在变量的方式,实现了对数据分布的建模,并能够生成新的数据。
与传统的自编码器不同,VAE不仅仅是学习数据的压缩表示,而是通过潜在变量的方式,学习了数据的分布。具体来说,VAE采用了一种编码器-解码器的结构,其中编码器将输入数据映射为潜在变量,解码器则将潜在变量映射为原始数据。通过对潜在变量的限制,VAE可以学习数据的分布,并能够使用该分布生成新的数据。
在训练过程中,VAE最小化重构误差以及潜在变量与先验分布之间的KL散度,从而使得学习到的分布与先验分布更接近,进而更好地生成新的数据。
生成对抗网络 Generative Adversarial Networks
生成对抗网络(Generative Adversarial Networks,简称GAN)是一种深度学习模型,由一个生成器和一个判别器组成。生成器用于生成伪造的数据,而判别器则负责区分真实数据和伪造数据。
GAN的训练过程是通过两个模型相互博弈的方式进行的。生成器试图生成越来越逼真的伪造数据,而判别器则试图区分真实数据和伪造数据。在训练过程中,两个模型相互博弈,不断调整参数,最终生成器可以生成与真实数据非常相似的伪造数据。
评估GAN
GAN的评估是一个非常复杂的问题,因为GAN生成的数据没有明确的标准答案。以下是一些常用的GAN评估方法:
可视化评估:观察生成器生成的样本,看是否与真实数据相似。如果生成的数据与真实数据非常相似,就可以认为该GAN表现良好。
定量评估:使用多个定量指标对GAN进行评估。这些指标包括FID(Fréchet Inception Distance)、IS(Inception Score)、KID(Kernel Inception Distance)等等。
人类评估:将GAN生成的样本展示给人类,让他们判断样本的真实程度。这种方法是最直接的评估方法,但也是最耗时和最主观的。
条件生成对抗网络
Conditional GANs(有条件的生成对抗网络)是一种GAN的变体,可以在生成过程中提供额外的条件信息。在标准GAN中,生成器只是将随机噪声转换为图像。而在Conditional GANs中,生成器会接收额外的条件信息,例如类别标签、文本描述等等,这些信息可以用来控制生成的图像的特定属性。
在Conditional GANs中,生成器和鉴别器都接收条件信息。生成器使用条件信息来生成特定属性的图像,鉴别器使用条件信息来提高其对于真实和虚假样本的区分能力。由于条件信息的引入,Conditional GANs可以用于各种任务,例如图像生成、图像编辑、图像转换等等。
需要注意的是,Conditional GANs的训练过程比标准GAN要复杂,需要同时考虑条件信息和生成器的生成能力。因此,需要在选择合适的条件信息和损失函数等方面进行仔细设计。
One-sided Label Smoothing
One-sided label smoothing是一种在分类问题中使用的正则化技术,目的是提高模型的泛化能力和对于未知数据的鲁棒性。在传统的分类问题中,模型的目标是使得预测概率分布的最大值与真实标签的one-hot编码匹配,而使用one-sided label smoothing,则会将真实标签的概率设置为 1 − ϵ 1-\epsilon 1−ϵ,其余类别的概率统一调整为 ϵ / ( n u m c l a s s e s − 1 ) \epsilon/(num_classes-1) ϵ/(numclasses−1)。其中 ϵ \epsilon ϵ是一个小的常数,num_classes是类别数目。
这种方法的目的是防止模型过于自信,从而降低过拟合风险,并增强模型对未知数据的鲁棒性。在实际使用中,epsilon的值可以根据数据集和模型进行调整。此外,one-sided label smoothing只会对真实标签进行平滑处理,因此被视为一种比较轻量级的正则化方法。
模式崩溃 Mode Collapse
在生成对抗网络 (GAN) 中,模式崩溃(Mode Collapse)是指生成器(Generator)产生的样本集合丧失了多样性,只集中在少数几个或甚至一个模式上的情况。
这种情况通常发生在生成器和判别器 (Discriminator) 的性能差异很大时,判别器可以轻松地区分真实样本和生成样本。为了避免被判别器拒绝,生成器会生成偏向于“安全”的样本,这导致生成器生成的样本呈现出高度重复的模式,而忽略了其他潜在的分布。
解决办法:Unrolled GAN
Unrolled GAN是一种改进的生成对抗网络(GAN)算法,它通过展开优化过程来训练生成器和判别器。在传统的GAN中,生成器和判别器是交替训练的,每一轮迭代生成器生成一些样本,判别器评估这些样本的真实度,并反馈给生成器进行改进。这个过程可以反复迭代直到达到预设的停止条件。
然而,Unrolled GAN的方法是在每一轮训练中,判别器都被优化了固定的K步,然后再使用优化后的判别器更新生成器。这样的优化可以更好地引导生成器的训练,使其产生更好的样本,同时也可以减少GAN中的模式崩溃问题。
Unrolled GAN还有一些变种,如Bidirectional GAN和GANSynth,它们都使用了展开优化的方法来改进GAN的训练效果。
语义分割 Semantic Segmentation
语义分割(Semantic Segmentation)是指对图像中的每个像素进行分类的任务,即将图像划分为若干个不同的区域,并对每个区域内的像素进行语义分类,最终输出一张与输入图像大小相同的分割结果图。与普通的图像分类任务不同,语义分割关注于像素级别的信息,需要对图像中的每个像素进行标注,通常使用颜色或数字来表示各个类别。语义分割在许多应用中都有重要的作用,例如自动驾驶、医疗图像分析、无人机航拍图像分析等。
评价指标
像素准确率(Pixel Accuracy)
像素准确率是指所有被正确分类的像素数量与总像素数量的比例,它衡量了模型对于每个像素的分类准确度。
1.Pixel Accuracy
P A = T P T P + F P PA = \frac{TP}{TP+FP} PA=TP+FPTP
其中, T P TP TP为正确分类的像素点数, F P FP FP为错误分类的像素点数。
2.均匀准确率(Mean Accuracy)
M A = 1 C ∑ i = 1 C T P i T P i + F P i MA = \frac{1}{C} \sum_{i=1}^{C} \frac{TP_i}{TP_i + FP_i} MA=C1i=1∑CTPi+FPiTPi
其中, C C C为类别数, T P i TP_i TPi为类别 i i i正确分类的像素点数, F P i FP_i FPi为类别 i i i错误分类的像素点数。
3.平均交并比(Mean Intersection over Union,Mean IoU)
I o U i = T P i T P i + F P i + F N i IoU_i = \frac{TP_i}{TP_i+FP_i+FN_i} IoUi=TPi+FPi+FNiTPi
M I o U = 1 C ∑ i = 1 C I o U i MIoU = \frac{1}{C} \sum_{i=1}^{C} IoU_i MIoU=C1i=1∑CIoUi
其中, T P i TP_i TPi为类别 i i i正确分类的像素点数, F P i FP_i FPi为类别 i i i被错误分类的像素点数, F N i FN_i FNi为类别 i i i被漏分类的像素点数。
4.Frequency Weighted IoU: 对每个类别的IoU进行加权平均,权重为每个类别的像素点数。
F I o U = ∑ i = 1 C n i × I o U i ∑ i = 1 C n i FIoU = \frac{\sum_{i=1}^{C} n_i \times IoU_i}{\sum_{i=1}^{C} n_i} FIoU=∑i=1Cni∑i=1Cni×IoUi
其中, n i n_i ni为类别 i i i的像素点数, I o U i IoU_i IoUi为类别 i i i的IoU。
编码器和解码器
编码器和解码器被用于将输入数据转换为潜在空间表示(编码器),并将潜在空间表示转换回输入数据(解码器)。
编码器将输入数据(如图像、文本等)转换为潜在空间表示,通常是一些向量或矩阵。这种表示通常被认为是对输入数据的压缩,其中包含了输入数据的重要信息。编码器通常由一些卷积层、池化层、全连接层等组成。
解码器接收潜在空间表示并将其解码为与原始输入数据具有相同形状和维度的输出数据。这通常涉及到将潜在表示转换回输入数据空间的逆操作,例如反卷积层、反池化层、全连接层等。解码器的目标是学习从潜在表示到输出数据的映射。
upsampling 上采样
解码器需要上采样来实现像素级预测
Bed of Nails
Bed of Nails是一种卷积神经网络(CNN)中的正则化技术,用于防止过度拟合。该技术通过随机地将输入数据的一部分设置为零来实现。
具体地说,Bed of Nails正则化技术将输入数据的一部分(通常是一定比例的神经元)设置为零,然后将其输入到CNN中进行训练。这样可以强制模型学习输入数据的局部特征,而不是简单地对整个输入进行建模。同时,Bed of Nails可以减少模型中神经元之间的相互依赖,从而减轻过度拟合问题。
Integrating Context Knowledge
Integrating Context Knowledge(融合上下文知识)是指在机器学习中,将先前已知的关于问题的上下文信息(比如先验知识、常识、领域知识等)融合进模型中,以提高模型的性能和泛化能力。这样的做法可以帮助模型更好地理解和处理数据,避免过拟合和欠拟合等问题。例如,在自然语言处理中,可以使用上下文信息来解决歧义问题,提高对话系统的准确性。在计算机视觉中,可以利用领域知识来提高图像分类、物体检测等任务的性能。
SegNet
SegNet是一种用于语义分割的神经网络架构,由剑桥大学的研究人员提出。SegNet主要包含一个编码器和一个解码器,其中编码器负责提取图像特征,解码器则将这些特征转换为分割结果。
SegNet的编码器部分采用了与VGG网络相似的结构,包含了13个卷积层和5个池化层。与VGG网络不同的是,SegNet在编码器中还引入了与池化层相对应的非线性下采样层,可以保存池化时遗失的位置信息。这些位置信息在解码器中非常重要,可以帮助SegNet恢复精细的分割结果。
SegNet的解码器部分包含13个反卷积层,每个反卷积层都与编码器中相应的卷积层进行匹配。这些反卷积层负责将编码器中提取的特征图进行上采样,并将位置信息与特征信息进行融合,最终得到像素级的分割结果。
U-Net
U-Net是一种用于图像分割的深度学习架构。它是一种全卷积神经网络(Fully Convolutional Network,FCN),并由Olaf Ronneberger、Philipp Fischer和Thomas Brox于2015年提出。
与传统的卷积神经网络不同,U-Net不仅包含卷积层,还包含对称的上采样(upsampling)和下采样(downsampling)层。其中,下采样层由卷积、下采样和激活函数组成,可以减小输入特征图的大小,提取特征。而上采样层由卷积、上采样和激活函数组成,可以将特征图恢复到原始大小,并同时保留更多的细节信息。这种对称的架构使U-Net非常适合于像素级别的语义分割任务,能够对图像中的每个像素进行分类。
U-Net还使用了一种skip connection的结构,使得网络在特征提取的同时可以保留低层次特征,避免信息丢失,从而提高了网络的准确性。U-Net在生物医学图像处理领域取得了很好的效果,也被广泛应用于其他图像分割任务中。
其他方法
1.膨胀卷积 Dilated convolutions
2.网络堆栈 Network stacks
3.多尺度网络 Multi-scale networks
4. 条件随机场 Conditional Random Fields
条件随机场 Conditional Random Fields
条件随机场(Conditional Random Fields,CRF)是一种概率图模型,常用于序列标注问题中,如自然语言处理和计算机视觉中的标注问题。
CRF模型假设输入数据是一个马尔可夫过程,每个时刻的输出是当前时刻及之前的所有输入的函数。它通过最大化给定输入序列的条件概率,来预测输出标签序列。
与隐马尔可夫模型(HMM)不同的是,CRF中输出状态之间的关系可以建模任意复杂的依赖关系。因此,CRF更适用于标注问题中的长距离依赖性建模。
目标检测Object Detection
Object Detection是计算机视觉领域中的一个重要任务,它的目标是在图像或视频中检测出特定物体的位置和类别。Object Detection可应用于许多领域,例如智能交通系统、安防监控、无人驾驶、医学图像分析等。
Object Detection的任务可以概括为:给定一张图像,输出该图像中所有目标物体的位置和类别信息。它通常包含两个子任务:目标检测和目标定位。
常见的基于深度学习的目标检测算法包括:Faster R-CNN、YOLO、SSD等。
滑动窗口 Sliding window
滑动窗口(Sliding window)是一种在图像处理、计算机视觉和模式识别中常用的技术,它是一种基于窗口的方法,通过滑动窗口在图像上进行遍历,并将每个窗口区域视为一个子图像进行处理。在物体检测领域中,滑动窗口通常用于在一幅图像上搜索可能包含待检测物体的区域。
滑动窗口的大小和步长可以预先设置或根据具体任务调整,一般情况下,滑动窗口的大小与待检测物体的大小相当,步长设置为比窗口大小稍小的值。当窗口与物体的大小不匹配时,可能需要进行缩放和裁剪等预处理操作。然后将每个窗口的特征提取出来,利用分类器对其进行分类,以确定是否包含待检测物体。由于需要遍历整幅图像,因此滑动窗口方法计算量较大,但是在一些场景中仍然被广泛应用。
Regional CNN
与传统的基于滑动窗口的目标检测方法不同,R-CNN使用区域提取网络(Region Proposal Network,RPN)来生成可能包含目标的区域,然后对这些区域进行分类和回归:
1.使用RPN在输入图像中生成若干个可能包含目标的候选区域。
2.对每个候选区域进行特征提取,得到一个固定长度的特征向量。
3.将特征向量输入到一个分类器中,判断该区域是否包含目标,并将其归为不同的类别。
4.对于包含目标的候选区域,使用回归器进一步精细地调整其位置,得到更精确的目标位置。
相比于传统的滑动窗口方法,R-CNN的优点在于可以避免对图像中所有位置都进行分类和回归,从而减少了计算量。此外,由于使用了区域提取网络,R-CNN能够对不同尺度和长宽比的目标进行检测,具有更好的通用性和鲁棒性。
Fast R-CNN
Fast R-CNN是一种基于区域的卷积神经网络(Region-based Convolutional Neural Network)目标检测算法,是R-CNN和SPP-Net的改进版本。与R-CNN和SPP-Net不同,Fast R-CNN通过RoI池化(Region of Interest pooling)将整个区域卷积成固定大小的特征图,从而大幅度降低了计算成本。Fast R-CNN采用全卷积网络来代替R-CNN中的全连接层,并且使用多任务损失函数对物体检测和类别分类同时进行优化,从而在检测准确率和处理速度上均优于R-CNN和SPP-Net。
YOLO
YOLO(You Only Look Once)是一种基于深度学习的实时目标检测算法。相较于传统的目标检测算法,如RCNN系列,YOLO采用一种全新的思路,将目标检测任务看做是一个回归问题,直接将目标框的位置和类别一起预测出来。
YOLO的主要特点包括:
1.实时性:YOLO的检测速度非常快,可以达到实时处理的水平。
2.端到端的模型:YOLO采用单个深度神经网络模型,直接从原始图像中预测目标框位置和类别,无需额外的后处理过程。
3.全局优化:YOLO采用了全局优化策略,能够捕捉到目标的上下文信息,使得检测效果更加准确。
4.目标检测精度高:YOLO在目标检测精度上表现优异,尤其是小目标检测的表现非常出色。
Single-Shot MultiBox Detector (SSD)
Single-Shot MultiBox Detector (SSD)的主要思想是在图像中通过对先前定义的一组锚点(anchor)进行分类和回归来检测物体。与其他物体检测算法不同,SSD可以在单个卷积神经网络中同时预测对象的类别和边界框,从而使它非常快速而准确。
SSD通过将多个卷积层和池化层结合在一起,构成一个全卷积神经网络,然后在每个特征图层中使用不同大小和宽高比的锚点,来检测物体。锚点会根据分类损失和定位损失进行训练,以最大化检测准确性。此外,SSD还使用了一种称为“hard negative mining”的技术,该技术可以减少负样本的影响并提高检测性能。
RetinaNet Detector
RetinaNet Detector是一种用于目标检测的神经网络模型,由微软研究院的一组研究人员于2017年提出。它的主要特点是使用了一种称为"Focal Loss"的新型损失函数来解决目标检测中的类别不平衡问题。
传统的目标检测模型通常使用交叉熵损失函数来优化模型参数。但是,在目标检测中,负样本(即背景)数量往往比正样本(即目标)数量多得多,这导致了类别不平衡问题。这会使得模型更加倾向于预测负样本,从而导致对于正样本的预测准确率下降。
RetinaNet通过引入Focal Loss来解决这个问题。该损失函数的基本思想是对于易于分类的负样本和难以分类的正样本分别进行加权,以使网络更加关注难以分类的正样本。具体来说,Focal Loss通过缩小易于分类的样本的权重来减少易于分类的负样本对损失函数的贡献,同时放大难以分类的正样本的权重以增加它们对损失函数的贡献。
除此之外,RetinaNet还使用了一种新的特征金字塔网络来检测不同大小的目标,并通过Anchor boxes来检测物体的位置。这使得RetinaNet在目标检测任务中取得了很好的性能。
实例分割 Instance Segmentation
实例分割(Instance Segmentation)是计算机视觉中的一个任务,其目标是将图像中的每个物体实例分割出来,并为每个物体实例分配一个唯一的标识符。与语义分割不同,实例分割要求在图像中识别出每个物体实例的边界框和像素级别的掩码。
Mask R-CNN
Mask R-CNN是一种基于Faster R-CNN的实例分割算法,由Kaiming He等人于2017年提出。Mask R-CNN在Faster R-CNN的基础上增加了一个分支网络,用于在检测到目标的基础上生成每个目标的掩膜。Mask R-CNN与Faster R-CNN类似,仍然是通过候选框提取感兴趣区域,然后使用卷积神经网络进行分类和回归。但是,Mask R-CNN在此基础上增加了一个分支网络,该分支网络可以生成每个检测到的目标的掩膜,从而实现实例级别的分割。
Mask R-CNN通过共享相同的卷积特征图来提高检测和分割的效率,同时保持高分辨率的目标特征。这使得Mask R-CNN可以实现准确的目标检测和精细的目标分割,因此在许多计算机视觉任务中都得到了广泛的应用。
weakly deep learning
Contrastive SSL
Contrastive self-supervised learning (SSL) 是一种无监督学习方法,旨在学习数据的表示,以便于后续的监督学习任务。Contrastive SSL的主要思想是学习将来自同一图像或来自不同图像的样本区分开的表示。这个方法的基本思路是将一个正样本(来自同一个图像)与一个负样本(来自不同图像)进行比较,通过将它们在嵌入空间中的距离拉近或推远来学习特征表示。
Contrastive SSL的基本流程如下:
1.从无标签数据中采样一个样本,将其分成两个部分:一个正样本和一个负样本。
2.将这两个部分的特征提取出来,并通过一个相似度度量函数(例如,余弦相似度或欧氏距离)计算它们之间的相似度。
3.通过一个损失函数(例如,对比损失或三元组损失)来最小化正样本和负样本之间的差异,使得正样本的相似度尽可能高,而负样本的相似度尽可能低。
4.重复上述步骤,直到模型的特征表示足够好以便于后续的监督学习任务。
Supervised Contrastive Learning
Supervised Contrastive Learning (SCL) 是一种自监督学习的形式,结合了对比损失和有标签数据的监督信号来提高表示学习的性能。与传统的监督学习不同,SCL使用对比学习来增强模型的表示能力,而不是使用标签来训练模型。这种方法旨在克服传统监督学习方法中存在的一些问题,如数据不足、标签质量问题和标签的高成本。
SCL的基本思想是,在有标签的数据集上训练一个分类器来将不同类别的样本区分开来,并使用对比学习来利用未标记的数据来增强表示能力。在对比学习中,模型被要求将相似的样本映射到接近的位置,将不相似的样本映射到远离的位置。这可以通过最大化相似样本之间的相似性来实现,同时最小化不同样本之间的相似性。
Supervised Contrastive Loss
该损失函数可以被用来进行度量学习(metric learning)和分类任务。它是基于对比损失函数(contrastive loss)和交叉熵损失函数(cross-entropy loss)的结合。
Supervised Contrastive Loss的计算包括两个步骤:第一步是对比损失,它用于测量相同类别的样本间的相似度;第二步是交叉熵损失,它用于测量模型对标签的分类性能。这两个损失分别被加权组合成最终的损失函数,可以使用梯度下降等方法进行优化。
Bootstrap SSL – A paradigm change
Bootstrap SSL是一种半监督学习的方法,旨在更好地利用未标记数据进行学习。相比于传统的半监督学习,Bootstrap SSL通过引入噪声来模拟未标记数据中的不确定性,从而提高模型的鲁棒性和泛化能力。
Bootstrap SSL的核心思想是通过估计模型在未标记数据上的置信度,来筛选出置信度高的样本作为伪标签,然后将伪标签加入到训练数据中进行有监督学习。具体来说,Bootstrap SSL通常包括以下步骤:
1.使用标记数据训练一个初始模型;
2.使用初始模型对未标记数据进行预测,得到每个样本在每个类别上的置信度;
3.根据置信度筛选出一部分高置信度的样本,并将其加入到训练数据中;
4.使用带有伪标签的训练数据进行有监督学习,更新模型参数;
5.重复步骤2-4,直到满足停止条件。
其中,步骤2中的置信度通常使用softmax概率或t-分布随机邻域嵌入(t-SNE)进行计算。在步骤3中,通常会将置信度阈值设为一个合适的值,以控制伪标签的数量和质量。此外,为了减少伪标签的噪声影响,还可以使用一些过滤方法,如基于互信息的过滤和基于聚类的过滤。