深度学习与机器学习的区别
深度学习由机器学习中的神经网络发展而来,机器学习多用于处理数值数据,而深度学习还可处理图片、音频等数据。
特征提取方面
- 机器学习的特征工程步骤需要靠手动完成,需要大量专业领域知识。
- 深度学习通常由多个层组成,它们通常将更简单的模型组合在一起,将数据从一层传递到另一层来构建更复杂的模型,通过训练大量数据自动得出模型而不用人工特征提取。
数据量和计算性能要求
机器学习需要的执行时间远少于深度学习,深度学习的参数往往很庞大,需要通过大量数据的多次优化来训练参数。
算法代表
- 机器学习
朴素贝叶斯、决策树等
- 深度学习
神经网络
神经网络
人工神经网络(Artificial Neural Network,简写为ANN)也简称为神经网络(NN)。它是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)结构和功能的计算模型。经典的神经网络结构包括三个层次的神经网络,分别为输入层、输出层以及隐藏层。
其中每层的圆圈代表一个神经元(以前也称之为感知机),隐藏层和输出层的神经元由输入的数据计算后输出,输入层的神经元只是输入。
神经网络的特点
- 每个链接都有权值
- 同一层神经元之间没有连接
- 最后的输出结果对应的层也称之为全连接层
感知机(PLA:Perceptron Learning Algorithm)
感知机就是模拟大脑神经网络处理数据的过程。
感知机是一种最基础的分类模型,类似于逻辑回归,不同的是,感知机的激活函数用的是sign,而逻辑回归用的是sigmoid。感知机也具有连接的权重和偏置。
softmax回归
Softmax回归将神经网络输出转换成概率结果。
交叉熵损失
神经网络最后的损失为平均每个样本的损失大小。
简单前向传播
首先随机生成一些权重w,然后根据w*x分别得出3.2、5.1、-1.7的得分,然后将得分用函数进行指数级的扩大(放大差距),然后再归一化变成[0,1]的数即可当成概率。同时用
函数来表示损失(因为归一化的数在[0,1]之间,当x在[0,1]时-log在
,x越小其-log越大即概率越小损失越大可以此表示损失)。
简单反向传播
由于最开始的权重是随机生成的,难免不贴合,所以反向传播做的就是根据损失去不断更新权重(通过计算损失对权重的导数)以达到贴合的效果即找到一组权重组合使得损失最小。
梯度是所有偏导数构成的向量,其方向指向损失增长最快的方向。
是学习率,负号表示沿损失减小方向调整。
随机梯度下降(SGD)
随机梯度下降(Stochastic Gradient Descent)。梯度下降(与牛顿迭代法类似都是迭代求解)是拿所有样本的平均损失来作为梯度下降的依据,容易陷入局部最优,而随机梯度下降是所有样本中随机取一个样本即拿单个样本的损失来作为梯度下降的依据,这样可能会跨越局部最优达到更优的点。
梯度下降更新权重
随机梯度下降更新权重
可见虽然随机梯度下降效果更好但时间复杂度更大(简单的来看一个是一重循环一个是双重循环),在实际中一般采用折中处理,即在N的样本中选取n个做相应的梯度然后更新w,即分成一批一批batch,n即后面所谓的batch_size。
几种损失函数的代码示例:
import torch
from torch.nn import L1Loss
from torch import nn
inputs = torch.tensor([1, 2, 3], dtype=torch.float32)
targets = torch.tensor([1, 2, 5], dtype=torch.float32)
inputs = torch.reshape(inputs, (1, 1, 1, 3))
targets = torch.reshape(targets, (1, 1, 1, 3))
#L1Loss平均绝对误差,reduction默认是mean求均值,sum则直接累加
loss = L1Loss(reduction='sum')#(1-1)+(2-2)+(5-3)=2
result = loss(inputs, targets)
loss_mse = nn.MSELoss()#平方损失函数,(1-1)^2+(2-2)^2+(5-3)^2=4/3=1.3333
result_mse = loss_mse(inputs, targets)
print(result)
print(result_mse)
x = torch.tensor([0.1, 0.2, 0.3])
y = torch.tensor([1])
x = torch.reshape(x, (1, 3))
loss_cross = nn.CrossEntropyLoss()#交叉熵损失
result_cross = loss_cross(x, y)
print(result_cross)