迁移学习、多任务学习、端到端的深度学习
1 迁移学习(Transfer learning)
有的时候神经网络可以从一个任务中习得知识,并将这些知识应用到另一个独立的任务中,例如,也许你已经训练好一个神经网络,能够识别像猫这样的对象,然后使用那些知识,或者部分习得的知识去帮助您更好地阅读 x 射线扫描图,这就是所谓的迁移学习。
具体来说,在第一阶段训练过程中,当你进行图像识别任务训练时,你可以训练神经网络的所有常用参数,所有的权重,所有的层,然后你就得到了一个能够做图像识别预测的网络。在训练了这个神经网络后,要实现迁移学习,你现在要做的是,把数据集换成新的(x, y)对,现在这些变成放射科图像,而y是你想要预测的诊断,你要做的是初始化最后一层的权重,让我们称之为w[L]和b[L]随机初始化。,如果你的放射科数据集很小,你可能只需要重新训练最后一层的权重,或者也许是最后一两层,就是w[L]和b[L],并保持其他参数不变。如果你有很多数据,那么也许你可以重新训练网络中的所有参数。如果你重新训练神经网络中的所有参数,那么这个在图像识别数据的初期训练阶段,有时称为预训练(pre-training),因为你在用图像识别数据去预先初始化,或者预训练神经网络的权重,然后,如果你以后更新所有权重,然后在放射科数据上训练,有时这个过程叫微调(fine tuning),预训练和微调的权重来源于迁移学习。
什么时候迁移学习是有意义的?如果你想从任务A学习并迁移一些知识到任务B,那么当任务A和任务B都有同样的输入x时,迁移学习是有意义的,比如A和B输入都是图像,或者输入都是音频。当任务A的数据比任务B多得多时,迁移学习意义更大,比如任务A有 1 百万个样本,任务B只有 1000 个样本,那么你从这 1 百万个样本学到的知识,真的可以帮你增强对更小数据集任务B的训练。
2 多任务学习(Multi-task learning)
在迁移学习中,你的步骤是串行的,你从任务A里学习只是然后迁移到任务B,在多任务学习中,你是同时开始学习的,试图让单个神经网络同时做几件事情,然后希望这里每个任务都能帮到其他所有任务。
举一个例子,假设你在研发无人驾驶车辆,那么你的无人驾驶车可能需要同时检测不同的物体,比如检测行人、车辆、停车标志,还有交通灯各种其他东西,输入图像x(i),输出标签y(i)不再是一个,可能会是更高维度,这里暂时就假设y(i)是个 4×1 向量。输入x,现在输出是一个四维向量y,训练一个神经网络,需要定义神经网络的损失函数,对于一个输出y^,是个 4维向量,对于整个训练集的平均损失:, 是单个预测的损失,标志L指的是 logistic 损失:
这与 softmax 回归的主要区别在于,与 softmax 回归不同,softmax 将单个标签分配给单个样本,这张图可以有很多不同的标签,因为多个物体可能同时出现在一张图里。如果你训练了一个神经网络,试图最小化这个成本函数,你做的就是多任务学习,当然我们也可以训练四个不同的神经网络,而不是训练一个网络做四件事情,但其实,训练一个神经网络做四件事情会比训练四个完全独立的神经网络分别做四件事性能要更好,这就是多任务学习的力量。当你可以训练一个足够大的神经网络,同时做好所有的工作,所以多任务学习的替代方法是为每个任务训练一个单独的神经网络。
平均来说,目前迁移学习使用频率更高。
3 端到端的深度学习(end-to-end deep learning)
以语音识别为例,你的目标是输入x,比如说一段音频,然后把它映射到一个输出y,就是这段音频的听写文本,所以传统上,语音识别需要很多阶段的处理,首先你会提取一些特征,然后一些手工设计的音频特征,在提取出一些低层次特征之后,你可以应用机器学习算法在音频片段中找到音位,然后你将音位串在一起构成独立的词,然后你将词串起来构成音频片段的听写文本。所以和这种有很多阶段的流水线相比,端到端深度学习做的是,你训练一个巨大的神经网络,输入就是一段音频,输出直接是听写文本,端到端深度学习就只需要把训练集拿过来,直接学到了x和y之间的函数映射,直接绕过了其中很多步骤。事实证明,端到端深度学习的挑战之一是,你可能需要大量数据才能让系统表现良好,端到端深度学习可以表现很好,也可以简化系统架构,让你不需要搭建那么多手工设计的单独组件,同时,正因为如此,端到端深度学习的弊端之一是它把可能有用的人工设计的组件排除在外了,有时候,精心设计的人工组件可能非常有用。
本文来自博客园,作者:zhang-X,转载请注明原文链接:https://www.cnblogs.com/YY-zhang/p/15067780.html
原文地址:https://www.cnblogs.com/YY-zhang/p/15067780.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 代理模式看这一篇就够了~
- Spark MLlib中KMeans聚类算法的解析和应用
- 通过 PHP 代码发送 HTTP 响应与文件下载
- 玩转 PhpStorm 系列(八):Vim 篇
- Android-Jetpack笔记-Paging结合数据库
- 分享 OWIN 静态文件处理中间件
- Android-Jetpack笔记-Paging结合网络数据
- 在 VS 2015 中使用 Gulp 编译 TypeScript
- Android-Jetpack笔记-WorkManager
- Android | Tangram动态页面之路(一)需求背景
- 吐槽 Micorsoft.Owin 的设计
- Android | Tangram动态页面之路(二)介绍
- 使用 ng-repeat-start 进行自定义显示
- AngularJS 多视图应用中的登录认证
- Android | Tangram动态页面之路(三)使用