深度学习之神经网络(一)

在前面文章中,我们已经系统了解了神经网络的部分概念,以及如何去搭建一个简单的神经网络模型。这篇文章我将主要讲解损失函数、反向传播等神经网络知识。


1. 损失函数

之前我们已经提到,损失函数就是用来计算我们的结果与真实值之间的误差,从而指导进一步的训练向正确的方向进行。

损失函数可以分为两大类:回归、分类。

1.1 回归损失

回归类的损失函数主要有MAE和MSE等。

1.1.1 MAE(Mean Absolute Error)

MAE为平均绝对误差,简单说就是计算输出值与真实值之间的误差绝对值大小的平均值。MAE是一种线性分数,所有个体差异在平均值上的权重都相等,比如,10和0之间的绝对误差是5和0之间绝对误差的两倍:

$$MAE(X,h)=\frac{1} {m}\sum_{i=1}^m | h(x_i)-y_i) |$$

  • 在高纬任务中表现比较好
  • 预测速度快
  • 对outliers(异常值)不敏感

1.1.2 MSE(Mean Square Error)

MSE为均方误差:

$$MSE(X,h)=\frac{1} {m}\sum_{i=1}^m (h(x_i)-y_i))^2$$

  • 比绝对误差函数得到的结果更精准
  • 对大的误差输出更敏感
  • 对outliers很敏感

1.2 分类损失

1.2.1 Cross-Entropy Loss

交叉熵损失,常在分类问题中使用,随着预测概率偏离实际标签,交叉熵会逐渐增加:

$$H(y,f)=-\sum_{i=1}^m y_i log(f(x_i))$$

  • 交叉熵能够衡量同一个随机变量中的两个不同概率分布的差异程度,在机器学习中就表示为真实概率分布与预测概率分布之间的差异。
  • 交叉熵经常搭配softmax使用,将输出的结果进行处理,使其多个分类的预测值和为1,再通过交叉熵来计算损失。


损失函数已经简单介绍完了,我们该如何训练神经网络,使得我们的损失最小呢?我们知道,梯度下降法是机器学习中一种用来“学习”参数的方法,神经网络中则可称为“反向传播”法。

2. 反向传播

前向传递输入信号直至输出产生误差,反向传播误差信息更新权重矩阵。

简单来说就是求偏导以及高数中的链式法则。(这里放个链接:反向传播,此文讲解的非常清楚)

假如我们有这样的一个数据集:

姓名 身高 体重 性别
张三 170 62
陈四 175 65
王霞 160 45
李红 165 50

为了方便处理,对其进行一定的处理:

我们现在的目标就是训练一个神经网络,来预测性别:

代码示例:

import numpy as npdef sigmoid(x):# activation functionreturn 1 / (1 + np.exp(-x))def deriv_sigmoid(x):# derivative of sigmoidz = sigmoid(x)return z * (1 - z)def mse_loss(y, yhat):# loss functiononreturn ((y - yhat) ** 2).mean()class my_NN(object):# set all weights and biasesdef __init__(self):self.w1, self.w2, self.w3, self.w4, self.w5, self.w6 = np.random.randn(6)self.b1, self.b2, self.b3 = np.random.randn(3)def feedforward(self, x):h1 = sigmoid(self.w1 * x[0] + self.w2 * x[1] + self.b1)h2 = sigmoid(self.w3 * x[0] + self.w4 * x[1] + self.b2)o1 = sigmoid(self.w5 * h1 + self.w6 * h2 + self.b3)return o1def train(self, inputs, y_trues):learn_rate = 0.1  # learning rateepochs = 1000  # number of times to loop through the entire datasetfor epoch in range(epochs):for x, y_true in zip(inputs, y_trues):# feedforwardsum_h1 = self.w1 * x[0] + self.w2 * x[1] + self.b1h1 = sigmoid(sum_h1)sum_h2 = self.w3 * x[0] + self.w4 * x[1] + self.b2h2 = sigmoid(sum_h2)sum_o1 = self.w5 * h1 + self.w6 * h2 + self.b3o1 = sigmoid(sum_o1)y_pred = o1# starting calculating the backward error# --- Naming: d_L_d_w1 represents "partial L / partial w1"d_L_d_ypred = -2 * (y_true - y_pred)# the neuron in the output layerd_ypred_d_w5 = h1 * deriv_sigmoid(sum_o1)d_ypred_d_w6 = h2 * deriv_sigmoid(sum_o1)d_ypred_d_b3 = deriv_sigmoid(sum_o1)d_ypred_d_h1 = self.w5 * deriv_sigmoid(sum_o1)d_ypred_d_h2 = self.w6 * deriv_sigmoid(sum_o1)# the one neuron in the hidden layerd_h1_d_w1 = x[0] * deriv_sigmoid(sum_h1)d_h1_d_w2 = x[1] * deriv_sigmoid(sum_h1)d_h1_d_b1 = deriv_sigmoid(sum_h1)# another oned_h2_d_w3 = x[0] * deriv_sigmoid(sum_h2)d_h2_d_w4 = x[1] * deriv_sigmoid(sum_h2)d_h2_d_b2 = deriv_sigmoid(sum_h2)# --- Update weights and biasesself.w1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w1self.w2 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w2self.b1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_b1self.w3 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w3self.w4 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w4self.b2 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_b2self.w5 -= learn_rate * d_L_d_ypred * d_ypred_d_w5self.w6 -= learn_rate * d_L_d_ypred * d_ypred_d_w6self.b3 -= learn_rate * d_L_d_ypred * d_ypred_d_b3if (epoch+1) % 100 == 0:y_preds = np.apply_along_axis(self.feedforward, 1, inputs)loss = mse_loss(y_trues, y_preds)print("第%d次 loss: %.3f" % (epoch+1, loss))data = np.array([[5, 15],[10, 20],[-3, -3],[1, 0],
])y_true = np.array([1,1,0,0,
])mynn = my_NN()
mynn.train(data, y_true)
Amy = np.array([0, 0]) # gender:F
print("predict: %.3f" %mynn.feedforward(Amy))

训练结果为:

第100次 loss: 0.115
第200次 loss: 0.032
第300次 loss: 0.012
第400次 loss: 0.007
第500次 loss: 0.005
第600次 loss: 0.004
第700次 loss: 0.003
第800次 loss: 0.002
第900次 loss: 0.002
第1000次 loss: 0.002
predict: 0.065

小结:梯度下降法是general的优化算法,反向传播法是其在神经网络上的具体实现方式。(开始以为它们两个都是相互独立的算法...)

深度学习之神经网络(二)相关推荐

  1. 花书+吴恩达深度学习(十二)卷积神经网络 CNN 之全连接层

    目录 0. 前言 1. 全连接层(fully connected layer) 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(十)卷积神经网络 CNN ...

  2. 神经网络与深度学习笔记汇总二

    神经网络与深度学习笔记汇总二 正交化(方便调整参数) 迭代 单实数评估指标(判断几种手段/方法哪个更好) 指标选取 训练集.开发集.测试集作用与用途 评估指标 判断算法是好是坏 迁移学习 总结 往期回 ...

  3. 深度学习入门(二十四)卷积神经网络——填充和步幅

    深度学习入门(二十四)卷积神经网络--填充和步幅 前言 卷积神经网络--填充和步幅 课件 填充 步幅 总结 课本 1 填充 2 步幅 3 小结 前言 核心内容来自博客链接1博客连接2希望大家多多支持作 ...

  4. 深度学习(1)基础1 -- 深度学习与神经网络基础

    目录 一.深度学习与神经网络 1.深度学习定义 2.神经网络 3.深度学习过程 4.深度学习功能 二.深度学习应用 三.分类数据集推荐 一.深度学习与神经网络 1.深度学习定义 深度学习(deep l ...

  5. 深度学习(神经网络) —— BP神经网络原理推导及python实现

    深度学习(神经网络) -- BP神经网络原理推导及python实现 摘要 (一)BP神经网络简介 1.神经网络权值调整的一般形式为: 2.BP神经网络中关于学习信号的求取方法: (二)BP神经网络原理 ...

  6. 人工智能、机器学习、深度学习和神经网络的区别

    人工智能 背景:人工智能最初可以追溯至1956年,当时多名计算机科学家在达特茅斯会议上共同提出了人工智能的概念.在随后几十年中,人工智能一方面被认为是人类文明未来的发展方向,另一方面也被认为是难以企及 ...

  7. 01.神经网络和深度学习 W2.神经网络基础

    文章目录 1. 二分类 2. 逻辑回归 3. 逻辑回归损失函数 4. 梯度下降 5. 导数 6. 计算图导数计算 7. 逻辑回归中的梯度下降 8. m个样本的梯度下降 9. 向量化 10. 向量化的更 ...

  8. 一文掌握深度学习、神经网络和学习过程的历史

    来源:算法与数学之美 本质上,深度学习是一个新兴的时髦名称,衍生于一个已经存在了相当长一段时间的主题--神经网络. 从20世纪40年代开始,深度学习发展迅速,直到现在.该领域取得了巨大的成功,深度学习 ...

  9. 零基础入门深度学习(3) - 神经网络和反向传播算法

    无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的技术,会不会感觉马上就o ...

  10. 深度学习 卷积神经网络-Pytorch手写数字识别

    深度学习 卷积神经网络-Pytorch手写数字识别 一.前言 二.代码实现 2.1 引入依赖库 2.2 加载数据 2.3 数据分割 2.4 构造数据 2.5 迭代训练 三.测试数据 四.参考资料 一. ...

最新文章

  1. 3.4 matlab用for语句实现循环结构
  2. OSI网络七层模型简明教程
  3. ASP.NET Core HTTP 管道中的那些事儿
  4. utc时间转换为时分秒_C语言操作时间函数,实现定时执行某个任务小程序
  5. Java List相关用法
  6. WebSocket跨域问题解决
  7. qt 编译成apk_GitHub - qtxtz/AndroidMerageAPK: 实现android自动打包的程序
  8. 什么是RIA 技术?
  9. 这么多技术我该怎么学 杨中科
  10. 高一计算机算法教案,高中信息技术 算法及其实现 教案
  11. android微信代码大全,微信隐藏代码大全,99%的人都不知道
  12. 计算机专业新生创新思维研究,计算机基础与计算思维探究论文
  13. 闭关之现代 C++ 笔记汇总(二):特性演化
  14. 1W+字概括精髓,Pandas中必知必会50例
  15. 如何拍摄VR全景照片
  16. 怎样把其他格式的音频文件转换成MP3格式的
  17. java开发面试复试_【java开发初轮技术面试以后 复试一般问什么?】-看准网
  18. Cesium 视锥体绘制,并动态更新朝向
  19. JavaScript入门经典(第5版)pdf
  20. sql常用操作(含指定位置添加字段、修改到指定位置后等)

热门文章

  1. jstack命令报错
  2. IT人 不要一辈子靠技术生存(转
  3. 【鱼眼镜头3】[鱼眼畸变模型]:除法模型(核密度估计径向失真校正方法)
  4. 机器学习平衡正负样本方法
  5. 数据--第49课 - 线性索引查找
  6. [Liferay6.2]Liferay Dynamic Query API示例
  7. 阿里云推出香港高防IP服务 为中国企业出海安全护航
  8. IBM Lotus Domino Designer 下载安装记录
  9. postgres-xc postgres 分布式数据库的一种
  10. linux下的hosts文件