2015年是人工智能特别是深度学习爆发的一年。
这一年谷歌的AlphaGo虽然还没有正式和李世石下棋(那是2016年3月的事),但深度学习已经在图像识别、语音识别、自然语言处理等领域取得了突破性的进展。Facebook、谷歌、微软、百度等科技巨头都在大力投入深度学习的研究。深度学习已经从学术界的小众领域变成了工业界的热门技术。
作为一个对人工智能感兴趣的程序员我一直想系统地学习一下深度学习。但深度学习涉及到很多数学知识(线性代数、概率论、微积分),还有很多复杂的概念(神经网络、反向传播、卷积神经网络、循环神经网络等),一直没有找到一本合适的入门书。
直到我读到了Ian Goodfellow、Yoshua Bengio、Aaron Courville合著的《深度学习》(Deep Learning)。这本书被称为深度学习的"圣经",是深度学习领域最权威、最全面的教材。三位作者都是深度学习领域的顶级专家:Ian Goodfellow是生成对抗网络(GAN)的发明者;Yoshua Bengio是深度学习的三巨头之一(另外两位是Geoffrey Hinton和Yann LeCun);Aaron Courville是蒙特利尔大学的教授深度学习的重要研究者。
这本书虽然比较厚比较难读但只要认真读一定会受益匪浅。今天就来分享一下我读这本书的一些笔记和思考。
什么是深度学习
在讲深度学习之前先简单介绍一下什么是机器学习什么是深度学习。
1. 机器学习
机器学习(Machine Learning),是人工智能的一个分支。它研究的是如何让计算机从数据中自动学习规律然后用这些规律来预测未知数据或者做出决策。
传统的编程是人把规则写死在程序里计算机按照规则执行。而机器学习是计算机从大量数据中自动学习规则然后用学到的规则来处理新的数据。
举个例子:识别垃圾邮件。传统的编程方法是人总结出垃圾邮件的特征(比如包含"中奖""免费""发票"等关键词发件人是陌生邮箱等),然后写程序按照这些规则判断邮件是不是垃圾邮件。但这种方法规则需要人不断地总结和更新而且垃圾邮件的发送者也会不断地变换手法绕过规则。
而机器学习的方法是给计算机大量的已经标注好的邮件(哪些是垃圾邮件哪些是正常邮件),让计算机自己学习垃圾邮件的特征。然后对于新的邮件计算机根据学到的特征判断是不是垃圾邮件。这种方法不需要人手动总结规则而且随着数据的增加模型的准确率会不断提高。
机器学习主要分为三类:
- 监督学习(Supervised Learning):训练数据有标签。计算机学习从输入到输出的映射。比如分类(判断邮件是不是垃圾邮件)、回归(预测房价)。
- 无监督学习(Unsupervised Learning):训练数据没有标签。计算机学习数据的内在结构和规律。比如聚类(把相似的数据分成一组)、降维(把高维数据降到低维)、密度估计。
- 强化学习(Reinforcement Learning):智能体(Agent),在环境中通过试错学习如何最大化奖励。比如AlphaGo下围棋游戏AI。
2. 深度学习
深度学习(Deep Learning),是机器学习的一个分支。它研究的是深层神经网络(Deep Neural Network)。
神经网络(Neural Network),是模仿人脑神经元的结构而设计的数学模型。它由大量的神经元(节点),组成神经元之间通过权重(Weight),连接。神经网络可以从数据中自动学习特征不需要人手动提取特征。
"深度",指的是神经网络的层数很多。传统的神经网络通常只有1-2层隐藏层而深度神经网络可以有几十层甚至上百层。层数越多神经网络能学习到的特征就越抽象越高级。
举个例子:图像识别。传统的机器学习方法需要人手动提取图像的特征(比如边缘、角点、纹理等),然后把这些特征输入到分类器中进行分类。而深度学习的方法是把原始图像直接输入到卷积神经网络(CNN)中神经网络会自动学习从底层的边缘、纹理到中层的形状、部件到高层的物体、场景等各种层次的特征。最后根据这些特征进行分类。这种方法不需要人手动提取特征而且准确率比传统方法高很多。
深度学习的优势在于:
- 自动特征学习:不需要人手动提取特征神经网络会自动学习从底层到高层的各种特征。
- 端到端学习:从原始输入到最终输出整个过程都是神经网络自动学习不需要中间的人工处理步骤。
- 大数据下的优势:随着数据量的增加深度学习的性能会不断提高而传统机器学习方法性能会很快达到瓶颈。
- GPU加速:深度学习的训练非常适合GPU并行计算。现在一块GPU可以顶几十块CPU大大加快了训练速度。
深度学习已经在很多领域取得了突破性的进展:
- 计算机视觉:图像分类、目标检测、人脸识别、图像分割、图像生成等。2012年AlexNet在ImageNet图像分类比赛中以远超第二名的准确率夺冠从此深度学习开始在计算机视觉领域统治。
- 语音识别:语音转文字、声纹识别、语音合成等。现在苹果Siri、谷歌Now、微软Cortana、百度语音等都使用了深度学习。
- 自然语言处理:机器翻译、文本分类、情感分析、问答系统、聊天机器人等。2014年Sequence to Sequence模型在机器翻译上取得了很好的效果。
- 推荐系统:电商推荐、视频推荐、音乐推荐、新闻推荐等。现在淘宝、京东、Netflix、YouTube等都使用了深度学习做推荐。
- 游戏:游戏AI、游戏内容生成等。DeepMind的DQN在Atari游戏上超过了人类玩家;AlphaGo在围棋上战胜了人类冠军。
深度学习的数学基础
深度学习涉及到很多数学知识。要学好深度学习需要掌握以下数学基础。
1. 线性代数
线性代数是深度学习最基础的数学工具。神经网络中的数据都是以向量、矩阵、张量的形式表示的。神经网络的前向传播、反向传播本质上都是矩阵运算。
需要掌握的线性代数知识:
- 标量、向量、矩阵、张量:标量是一个数;向量是一列数;矩阵是二维数组;张量是多维数组。
- 矩阵运算:矩阵加法、矩阵乘法、矩阵转置、矩阵的逆、矩阵的行列式、矩阵的特征值和特征向量等。
- 向量运算:向量加法、向量数乘、向量内积(点积)、向量外积(叉积)、向量的范数(L1范数、L2范数)等。
- 特殊矩阵:单位矩阵、对角矩阵、对称矩阵、正交矩阵、正定矩阵等。
- 矩阵分解:特征分解、奇异值分解(SVD)、主成分分析(PCA)等。
2. 概率论与数理统计
概率论是深度学习另一个重要的数学基础。深度学习中很多模型都是基于概率的。比如生成模型学习的是数据的概率分布;分类模型输出的是每个类别的概率。
需要掌握的概率论知识:
- 随机变量:离散型随机变量、连续型随机变量。
- 概率分布:概率质量函数(PMF)、概率密度函数(PDF)、累积分布函数(CDF)。
- 常见概率分布:伯努利分布、二项分布、泊松分布、均匀分布、正态分布(高斯分布)、指数分布、拉普拉斯分布、Dirac delta分布等。
- 期望、方差、协方差:期望(均值)、方差、标准差、协方差、相关系数。
- 条件概率、贝叶斯定理:条件概率、全概率公式、贝叶斯定理。
- 信息论:熵(Entropy)、交叉熵(Cross-Entropy)、KL散度(Kullback-Leibler Divergence)、互信息(Mutual Information)等。交叉熵在分类问题中经常作为损失函数。
3. 微积分
微积分是深度学习优化算法的基础。神经网络的训练本质上是一个优化问题通过梯度下降不断地更新参数最小化损失函数。而梯度就是损失函数对参数的偏导数。
需要掌握的微积分知识:
- 导数、偏导数:导数是函数在某一点的变化率;偏导数是多元函数对某一个变量的导数。
- 梯度:梯度是一个向量由函数对每个变量的偏导数组成。梯度的方向是函数增长最快的方向;梯度的反方向是函数下降最快的方向。梯度下降就是沿着梯度的反方向更新参数。
- 链式法则:复合函数的求导法则。神经网络的反向传播本质上就是链式法则的应用。
- 积分:定积分、不定积分。在概率论中经常用到积分。
- 数值计算:数值微分、数值积分、优化算法(梯度下降、牛顿法、共轭梯度法等)。
4. 数值计算
深度学习是一门实验科学。很多时候理论上可行的算法在实际计算中可能会遇到各种数值问题。
需要掌握的数值计算知识:
- 上溢、下溢:当数值太大超过了计算机能表示的范围就是上溢;当数值太小接近0被计算机舍入为0就是下溢。softmax函数就容易遇到上溢和下溢问题。
- 病态条件:函数的输入稍微变化就会导致输出巨大变化。矩阵的条件数就是衡量矩阵病态程度的指标。
- 梯度爆炸、梯度消失:在深层神经网络中梯度在反向传播过程中可能会指数级增长(梯度爆炸),或者指数级衰减(梯度消失)。这会导致深层神经网络难以训练。
- 优化算法:梯度下降、随机梯度下降(SGD)、小批量梯度下降(Mini-batch SGD)、动量(Momentum)、AdaGrad、RMSProp、Adam等。
深度神经网络
1. 神经元
神经元(Neuron),是神经网络的基本单元。它接收多个输入经过加权求和再通过一个激活函数输出一个值。
数学表示:
z = w1*x1 + w2*x2 + ... + wn*xn + b
a = f(z)其中:
- x1, x2, ..., xn是输入
- w1, w2, ..., wn是权重(Weight)
- b是偏置(Bias)
- z是加权求和的结果
- f是激活函数(Activation Function)
- a是输出
2. 激活函数
激活函数是神经网络中非常重要的一部分。它给神经网络引入了非线性使得神经网络可以拟合任意复杂的函数。如果没有激活函数那么无论神经网络有多少层都等价于一个线性变换因为线性变换的组合还是线性变换。
常见的激活函数:
- Sigmoid函数:f(x) = 1 / (1 + e^(-x))。输出在(0, 1)之间可以看作概率。缺点是容易梯度消失而且输出不是以0为中心。
- Tanh函数:f(x) = (e^x - e^(-x)) / (e^x + e^(-x))。输出在(-1, 1)之间以0为中心。比Sigmoid好但还是有梯度消失问题。
- ReLU函数:f(x) = max(0, x)。输入大于0输出等于输入;输入小于等于0输出0。优点是计算简单不会梯度消失(正区间),收敛速度快。缺点是输出不是以0为中心而且可能,"死亡"(输入一直小于0梯度一直为0参数不再更新)。
- Leaky ReLU函数:f(x) = max(αx, x),α,通常是0.01。和ReLU类似但输入小于0时输出是αx而不是0。这样就不会,"死亡"。
- PReLU函数:和Leaky ReLU类似但α,是可学习的参数不是固定的。
- ELU函数:f(x) = x, if x > 0; f(x) = α(e^x - 1), if x <= 0。输出以0为中心不会,"死亡",但计算比ReLU复杂。
- Softmax函数:f(xi) = e^(xi) / Σj e^(xj)。用于多分类问题的输出层把输出转换成概率所有类别的概率加起来等于1。
现在最常用的激活函数是ReLU以及它的变体(Leaky ReLU、PReLU、ELU等)。
3. 神经网络的结构
神经网络通常由输入层、隐藏层、输出层组成。
- 输入层(Input Layer):接收原始数据输入。输入层的神经元数量等于输入数据的维度。比如MNIST手写数字识别输入是28x28的图像展开成784维的向量所以输入层有784个神经元。
- 隐藏层(Hidden Layer):在输入层和输出层之间可以有多层。隐藏层的神经元对输入进行特征提取和变换。隐藏层的层数和每层的神经元数量是神经网络的超参数需要根据经验调整。
- 输出层(Output Layer):输出最终结果。输出层的神经元数量取决于任务。比如二分类问题输出层1个神经元输出0或1的概率;多分类问题输出层N个神经元(N是类别数),输出每个类别的概率;回归问题输出层1个神经元输出预测值。
4. 前向传播
前向传播(Forward Propagation),是指数据从输入层经过隐藏层到输出层计算出预测值的过程。
以一个两层的神经网络(输入层、隐藏层、输出层)为例:
# 输入层到隐藏层
z1 = W1 * x + b1
a1 = f(z1)
# 隐藏层到输出层
z2 = W2 * a1 + b2
a2 = f(z2)
# a2,就是,预测值
y_hat = a2其中W1、b1是输入层到隐藏层的权重和偏置;W2、b2是隐藏层到输出层的权重和偏置;f是激活函数。
5. 损失函数
损失函数(Loss Function),用来衡量预测值和真实值之间的差距。损失函数的值越小说明预测越准确。
常见的损失函数:
- 均方误差(MSE, Mean Squared Error):L = (1/n) * Σ(y_hat - y)^2。用于回归问题。
- 平均绝对误差(MAE, Mean Absolute Error):L = (1/n) * Σ|y_hat - y|。用于回归问题。
- 交叉熵损失(Cross-Entropy Loss):L = -Σ y * log(y_hat)。用于分类问题。二分类用二元交叉熵;多分类用多分类交叉熵(结合Softmax)。
- Hinge损失:L = max(0, 1 - y * y_hat)。用于支持向量机(SVM)。
神经网络的训练目标就是最小化损失函数。
6. 反向传播
反向传播(Back Propagation),是训练神经网络的核心算法。它通过链式法则从输出层到输入层逐层计算损失函数对每个参数的梯度。然后用梯度下降更新参数。
反向传播的过程:
- 前向传播:计算每一层的输出和最终的损失函数值。
- 输出层的误差:计算损失函数对输出层输入的梯度(误差)。
- 反向传播误差:从输出层到输入层逐层计算每一层的误差。利用链式法则当前层的误差等于后一层的误差乘以后一层的权重再乘以当前层激活函数的导数。
- 计算梯度:根据每一层的误差和输入计算损失函数对权重和偏置的梯度。
- 更新参数:用梯度下降更新权重和偏置。W = W - learningrate dW;b = b - learningrate db。
反向传播是1986年由Rumelhart、Hinton、Williams提出的。它使得训练多层神经网络变得高效。
7. 梯度下降优化算法
梯度下降(Gradient Descent),是最基本的优化算法。它沿着梯度的反方向更新参数使得损失函数不断减小。
常见的梯度下降优化算法:
- 批量梯度下降(Batch Gradient Descent):每次更新使用全部训练数据计算梯度。准确但慢而且内存可能不够。
- 随机梯度下降(SGD, Stochastic Gradient Descent):每次更新使用一个样本计算梯度。快但噪声大损失函数会震荡。
- 小批量梯度下降(Mini-batch SGD):每次更新使用一小批样本(比如32、64、128个),计算梯度。兼顾了速度和准确性。是最常用的。
- 动量(Momentum):在SGD的基础上加入了动量项。动量积累了之前的梯度方向使得更新更加平滑减少震荡加快收敛。
- AdaGrad:自适应学习率。对经常更新的参数学习率减小;对不经常更新的参数学习率增大。适合稀疏数据。
- RMSProp:和AdaGrad类似但用了指数移动平均来累积梯度的平方避免了学习率过早减小到0。
- Adam:结合了动量和RMSProp。是目前最常用的优化算法之一。自适应学习率而且有动量收敛快效果好。
学习率(Learning Rate),是非常重要的超参数。学习率太大会震荡甚至发散;学习率太小收敛太慢。通常需要根据经验调整或者使用学习率衰减(随着训练进行逐渐减小学习率)。
卷积神经网络(CNN)
卷积神经网络(CNN, Convolutional Neural Network),是专门用于处理网格状数据(如图像)的深度神经网络。它在计算机视觉领域取得了巨大的成功。
1. 为什么需要CNN
传统的全连接神经网络处理图像时需要把图像展开成一个一维向量。比如一张224x224的彩色图像展开后是2242243 = 150528维的向量。如果隐藏层有1000个神经元那么这一层的参数就是150528 * 1000 ≈ 1.5亿个。参数太多了容易过拟合而且训练很慢。
而且全连接神经网络丢失了图像的空间结构信息。图像中相邻的像素是相关的但展开成一维向量后这种空间相关性就丢失了。
卷积神经网络通过卷积(Convolution)、池化(Pooling)等操作保留了图像的空间结构而且大大减少了参数数量。
2. 卷积层
卷积层(Convolutional Layer),是CNN的核心。它通过卷积核(Filter/Kernel),在输入图像上滑动进行卷积运算提取特征。
卷积运算的过程:
- 卷积核是一个小的矩阵(比如3x3、5x5),有自己的权重。
- 卷积核在输入图像上从左到右从上到下滑动。
- 每滑动到一个位置卷积核和对应位置的图像区域进行元素相乘再求和得到输出特征图的一个值。
- 滑动完所有位置后就得到了输出的特征图(Feature Map)。
卷积层的优势:
- 局部连接:每个神经元只连接输入的一个局部区域而不是全部。这模拟了人脑视觉皮层的局部感受野。
- 参数共享:同一个卷积核在整个图像上滑动权重是共享的。这大大减少了参数数量。比如一个3x3的卷积核只有9个参数不管图像多大。
- 平移不变性:因为参数共享所以同一个特征不管出现在图像的哪个位置都能被同一个卷积核检测到。
卷积层的超参数:
- 卷积核大小:通常3x3、5x5、7x7。现在3x3最常用。
- 卷积核数量:也就是输出特征图的通道数。比如64个卷积核输出64个特征图。
- 步长(Stride):卷积核每次滑动的距离。步长越大输出特征图越小。
- 填充(Padding):在输入图像的边缘填充0。这样可以控制输出特征图的大小。"Same"填充使得输出和输入大小一样;"Valid"填充不填充输出比输入小。
3. 激活层
卷积层之后通常会接一个激活函数(通常是ReLU),引入非线性。
4. 池化层
池化层(Pooling Layer),用来降低特征图的尺寸减少参数和计算量同时提高特征的鲁棒性。
常见的池化操作:
- 最大池化(Max Pooling):取窗口内的最大值。比如2x2的最大池化取2x2区域内的最大值。
- 平均池化(Average Pooling):取窗口内的平均值。
最大池化更常用因为它能保留最显著的特征。
池化层没有可学习的参数它只是对特征图进行下采样。
5. 全连接层
在多个卷积层、激活层、池化层之后通常会接一个或多个全连接层最后是输出层。
全连接层把卷积层提取的特征进行整合然后输出最终的预测结果。
现在也有一些网络用全局平均池化(Global Average Pooling),代替全连接层进一步减少参数防止过拟合。
6. 经典CNN模型
- LeNet-5:1998年Yann LeCun提出用于手写数字识别。是最早的CNN之一。
- AlexNet:2012年Alex Krizhevsky提出在ImageNet比赛中夺冠。让深度学习开始受到关注。8层使用了ReLU、Dropout、GPU加速。
- VGGNet:2014年牛津大学VGG组提出。特点是结构简洁全部用3x3的卷积核和2x2的最大池化。有VGG16、VGG19等。
- GoogLeNet(Inception):2014年谷歌提出。特点是Inception模块在同一层使用不同大小的卷积核提取不同尺度的特征。而且用了1x1卷积降维减少计算量。
- ResNet:2015年何恺明等提出。特点是残差连接(Skip Connection),解决了深层网络的梯度消失问题。使得训练上百层甚至上千层的网络成为可能。ResNet在ImageNet比赛中取得了超过人类的准确率。是目前最常用的CNN模型之一。
循环神经网络(RNN)
循环神经网络(RNN, Recurrent Neural Network),是专门用于处理序列数据(如文本、语音、时间序列)的深度神经网络。
1. 为什么需要RNN
传统的神经网络(包括CNN),输入和输出都是固定长度的而且输入之间是独立的。但序列数据比如文本是由一个个词组成的词和词之间是有依赖关系的。比如,"我吃苹果","吃"这个动作和,"苹果"这个宾语是相关的。
RNN通过隐藏状态(Hidden State),保存了之前的信息使得处理当前输入时能考虑到之前的输入。这使得RNN非常适合处理序列数据。
2. RNN的结构
RNN的基本结构是一个循环的隐藏层。每一步隐藏层接收当前的输入和上一步的隐藏状态然后输出当前的隐藏状态和当前的输出。
数学表示:
h_t = f(W_xh * x_t + W_hh * h_(t-1) + b_h)
y_t = W_hy * h_t + b_y其中:
- x_t是第t步的输入
- h_(t-1),是第t-1步的隐藏状态
- h_t是第t步的隐藏状态
- y_t是第t步的输出
- Wxh、Whh、W_hy是权重矩阵
- bh、by是偏置
- f是激活函数(通常是Tanh)
可以看到RNN的权重是共享的每一步都用同一套权重。这减少了参数数量。
RNN可以处理任意长度的序列而且每一步都可以有输出也可以只在最后一步有输出。
3. RNN的应用
RNN的常见应用:
- 语言模型:根据前面的词预测下一个词。用于文本生成、机器翻译等。
- 机器翻译:输入一种语言的句子输出另一种语言的句子。
- 文本分类:输入文本输出类别(如情感分析、垃圾邮件分类)。
- 命名实体识别:从文本中识别出人名、地名、组织名等。
- 语音识别:输入语音序列输出文字。
- 时间序列预测:根据历史数据预测未来的值(如股票预测、天气预测)。
4. LSTM和GRU
传统的RNN有一个很大的问题就是长程依赖(Long-term Dependency)问题。当序列很长时RNN很难记住很早之前的信息。因为梯度在反向传播过程中会指数级衰减(梯度消失),或者指数级增长(梯度爆炸)。
为了解决这个问题研究者提出了LSTM(Long Short-Term Memory长短期记忆网络),和GRU(Gated Recurrent Unit门控循环单元)。
LSTM:1997年Hochreiter和Schmidhuber提出。它通过门控机制(输入门、遗忘门、输出门),和细胞状态(Cell State),来控制信息的流动。细胞状态像一条传送带信息可以在上面流动很少改变。门决定了哪些信息通过哪些信息被遗忘。这使得LSTM能很好地记住长程依赖。
GRU:2014年Cho等提出。它是LSTM的简化版只有两个门(更新门、重置门),而且没有单独的细胞状态。GRU参数比LSTM少训练更快效果和LSTM差不多。
现在LSTM和GRU是最常用的RNN变体。
5. Sequence to Sequence模型
Sequence to Sequence(Seq2Seq)模型2014年Sutskever等提出。它用于输入和输出都是序列而且长度可能不一样的任务比如机器翻译。
Seq2Seq模型由编码器(Encoder),和解码器(Decoder),组成:
- 编码器:通常是一个RNN(LSTM/GRU),读取输入序列把整个输入序列编码成一个固定长度的向量(上下文向量Context Vector)。
- 解码器:通常也是一个RNN(LSTM/GRU),接收编码器的上下文向量然后一步步生成输出序列。每一步解码器根据上下文向量、上一步的输出、上一步的隐藏状态生成当前的输出。
Seq2Seq模型在机器翻译上取得了很好的效果。后来又有了注意力机制(Attention),使得解码器每一步都能关注输入序列的不同部分效果更好。
深度学习的正则化
深度学习模型通常很复杂参数很多容易过拟合(Overfitting)。过拟合是指模型在训练集上表现很好但在测试集(未知数据)上表现很差。也就是说模型记住了训练数据的细节和噪声而没有学习到真正的规律。
为了防止过拟合需要使用正则化(Regularization)技术。
常见的正则化方法:
- L2正则化(权重衰减):在损失函数中加入权重的L2范数(平方和),作为惩罚项。这使得权重不会太大。因为太大的权重会导致损失函数增大。
- L1正则化:在损失函数中加入权重的L1范数(绝对值和),作为惩罚项。这会使得很多权重变成0相当于特征选择。
- Dropout:训练时随机地让一部分神经元失活(输出为0)。这防止了神经元之间过度依赖增强了模型的鲁棒性。测试时所有神经元都激活但输出要乘以失活概率。Dropout是Hinton,2012年提出的非常有效。
- 数据增强(Data Augmentation):对训练数据进行变换生成更多的训练数据。比如图像分类中对图像进行翻转、裁剪、旋转、缩放、颜色抖动等。这增加了数据量也增强了模型的泛化能力。
- 提前停止(Early Stopping):训练时监控验证集的损失。当验证集的损失不再下降甚至开始上升时停止训练。这防止了模型在训练集上训练过度。
- 批量归一化(Batch Normalization):对每一层的输入进行归一化使得输入的均值为0方差为1。这使得训练更稳定更快也有一定的正则化效果。
- 参数共享:如CNN的卷积核参数共享RNN的权重共享也减少了参数数量防止过拟合。
深度学习的挑战与未来
1. 深度学习的挑战
虽然深度学习取得了巨大的成功但还是面临很多挑战:
- 数据需求大:深度学习通常需要大量的标注数据。但很多场景标注数据很难获取成本很高。如何用少量数据训练出好的模型(小样本学习、零样本学习),是一个重要的研究方向。
- 计算资源需求大:深度学习的训练需要大量的计算资源(GPU、TPU等)。训练一个大模型可能需要几十块甚至上百块GPU跑几天甚至几周。这使得小公司和个人很难训练大模型。
- 可解释性差:深度学习是一个,"黑箱"。我们知道输入什么输出什么但不知道模型内部是怎么做出决策的。这在医疗、金融、法律等对可解释性要求高的领域是一个大问题。
- 对抗样本:深度学习模型很容易被对抗样本(Adversarial Example),欺骗。在输入上加入人眼察觉不到的微小扰动就能让模型分类错误。这在安全敏感的场景(如自动驾驶、人脸识别),是一个严重的安全隐患。
- 泛化能力有限:深度学习模型在训练数据分布和测试数据分布一致时表现很好。但如果分布不一致(域偏移),表现就会大幅下降。如何提高模型的泛化能力和域适应能力是一个挑战。
- 能耗大:训练大模型需要消耗大量的电力。据估计训练一个大的语言模型产生的碳排放相当于五辆汽车一生的碳排放。如何让深度学习更节能更环保也是一个需要考虑的问题。
2. 深度学习的未来
深度学习未来的发展方向可能包括:
- 无监督学习、自监督学习:现在深度学习大部分还是监督学习需要大量标注数据。未来无监督学习、自监督学习可能会有更大的发展。让模型从无标注数据中自动学习特征和表示。
- 小样本学习、零样本学习:让模型用少量样本甚至零样本就能学习到新的概念。这更接近人类的学习方式。
- 强化学习:强化学习在游戏、机器人等领域取得了很好的效果。未来强化学习和深度学习结合可能会在更多领域取得突破。
- 图神经网络(GNN):图神经网络用于处理图结构数据(如社交网络、分子结构、知识图谱)。这是一个热门的研究方向。
- 注意力机制、Transformer:注意力机制让模型能关注输入的重要部分。Transformer模型完全基于注意力机制没有RNN的循环结构能更好地并行计算。2017年谷歌提出的Transformer在自然语言处理领域取得了巨大成功(BERT、GPT等)。未来Transformer可能会扩展到更多领域。
- 神经符号结合:把神经网络的感知能力和符号主义的推理能力结合起来。这可能是实现通用人工智能(AGI)的一个方向。
- 更高效的模型和算法:设计更轻量、更高效的模型结构和算法使得深度学习能在手机、嵌入式设备等资源受限的设备上运行。模型压缩、量化、剪枝、知识蒸馏等都是热门方向。
- 可解释AI(XAI):提高深度学习模型的可解释性让我们知道模型是怎么做出决策的。这对于深度学习在医疗、金融、法律等领域的应用非常重要。
写在最后
《深度学习》这本书是深度学习领域最权威、最全面的教材。它从数学基础到深度神经网络到CNN、RNN到正则化、优化算法到深度学习的研究方向都做了系统、深入的讲解。
当然这本书也比较难读。它涉及到很多数学知识和复杂的概念。对于数学基础不好的读者可能会觉得比较吃力。但我相信只要有耐心认真读多思考多实践一定能读懂并且受益匪浅。
作为一个程序员我为什么要读深度学习呢?因为我觉得人工智能特别是深度学习是未来的趋势。现在已经有很多领域被深度学习改变了。未来深度学习会渗透到更多的领域改变我们的生活和工作。作为一个程序员了解深度学习掌握深度学习能让我们在未来的技术变革中不被淘汰甚至抓住机会。
而且学习深度学习也能锻炼我们的思维能力。深度学习涉及到线性代数、概率论、微积分、优化算法等很多数学知识。学习这些知识能让我们从不同的角度思考问题提升我们的抽象思维和逻辑思维能力。
当然深度学习不是银弹。它不是万能的也有很多局限和挑战。我们不应该盲目地崇拜深度学习也不应该因为它的局限就否定它。我们应该理性地看待深度学习了解它的优势和不足在合适的场景使用它。
最后用Yoshua Bengio的一句话来结尾:
"深度学习是一种让计算机通过层次化的特征学习来理解世界的方法。它不是终点而是通往人工智能的一步。"
希望每一个对人工智能感兴趣的朋友都能读一读这本书走进深度学习的世界。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录