机器学习:详解迁移学习(Transfer learning)
详解迁移学习
深度学习中,最强大的理念之一就是,有的时候神经网络可以从一个任务中习得知识,并将这些知识应用到另一个独立的任务中。所以例如,也许已经训练好一个神经网络,能够识别像猫这样的对象,然后使用那些知识,或者部分习得的知识去帮助您更好地阅读x射线扫描图,这就是所谓的迁移学习。
来看看,假设已经训练好一个图像识别神经网络,所以首先用一个神经网络,并在\((x,y)\)对上训练,其中\(x\)是图像,\(y\)是某些对象,图像是猫、狗、鸟或其他东西。如果把这个神经网络拿来,然后让它适应或者说迁移,在不同任务中学到的知识,比如放射科诊断,就是说阅读\(X\)射线扫描图。可以做的是把神经网络最后的输出层拿走,就把它删掉,还有进入到最后一层的权重删掉,然后为最后一层重新赋予随机权重,然后让它在放射诊断数据上训练。
具体来说,在第一阶段训练过程中,当进行图像识别任务训练时,可以训练神经网络的所有常用参数,所有的权重,所有的层,然后就得到了一个能够做图像识别预测的网络。在训练了这个神经网络后,要实现迁移学习,现在要做的是,把数据集换成新的\((x,y)\)对,现在这些变成放射科图像,而\(y\)是想要预测的诊断,要做的是初始化最后一层的权重,让称之为\(w^{[L]}\)和\(b^{[L]}\)随机初始化。
现在,在这个新数据集上重新训练网络,在新的放射科数据集上训练网络。要用放射科数据集重新训练神经网络有几种做法。可能,如果的放射科数据集很小,可能只需要重新训练最后一层的权重,就是\(w^{[L]}\)和\(b^{[L]}\)并保持其他参数不变。如果有足够多的数据,可以重新训练神经网络中剩下的所有层。经验规则是,如果有一个小数据集,就只训练输出层前的最后一层,或者也许是最后一两层。但是如果有很多数据,那么也许可以重新训练网络中的所有参数。如果重新训练神经网络中的所有参数,那么这个在图像识别数据的初期训练阶段,有时称为预训练(pre-training),因为在用图像识别数据去预先初始化,或者预训练神经网络的权重。然后,如果以后更新所有权重,然后在放射科数据上训练,有时这个过程叫微调(fine tuning)。如果在深度学习文献中看到预训练和微调,就知道它们说的是这个意思,预训练和微调的权重来源于迁移学习。
在这个例子中做的是,把图像识别中学到的知识应用或迁移到放射科诊断上来,为什么这样做有效果呢?有很多低层次特征,比如说边缘检测、曲线检测、阳性对象检测(positive objects),从非常大的图像识别数据库中习得这些能力可能有助于的学习算法在放射科诊断中做得更好,算法学到了很多结构信息,图像形状的信息,其中一些知识可能会很有用,所以学会了图像识别,它就可能学到足够多的信息,可以了解不同图像的组成部分是怎样的,学到线条、点、曲线这些知识,也许对象的一小部分,这些知识有可能帮助的放射科诊断网络学习更快一些,或者需要更少的学习数据。
这里是另一个例子,假设已经训练出一个语音识别系统,现在\(x\)是音频或音频片段输入,而\(y\)是听写文本,所以已经训练了语音识别系统,让它输出听写文本。现在说想搭建一个“唤醒词”或“触发词”检测系统,所谓唤醒词或触发词就是说的一句话,可以唤醒家里的语音控制设备,比如说“Alexa”可以唤醒一个亚马逊Echo设备,或用“OK Google”来唤醒Google设备,用"Hey Siri"来唤醒苹果设备,用"好百度"唤醒一个百度设备。要做到这点,可能需要去掉神经网络的最后一层,然后加入新的输出节点,但有时可以不只加入一个新节点,或者甚至往的神经网络加入几个新层,然后把唤醒词检测问题的标签\(y\)喂进去训练。再次,这取决于有多少数据,可能只需要重新训练网络的新层,也许需要重新训练神经网络中更多的层。
那么迁移学习什么时候是有意义的呢?迁移学习起作用的场合是,在迁移来源问题中有很多数据,但迁移目标问题没有那么多数据。例如,假设图像识别任务中有1百万个样本,所以这里数据相当多。可以学习低层次特征,可以在神经网络的前面几层学到如何识别很多有用的特征。但是对于放射科任务,也许只有一百个样本,所以的放射学诊断问题数据很少,也许只有100次\(X\)射线扫描,所以从图像识别训练中学到的很多知识可以迁移,并且真正帮加强放射科识别任务的性能,即使的放射科数据很少。
对于语音识别,也许已经用10,000小时数据训练过的语言识别系统,所以从这10,000小时数据学到了很多人类声音的特征,这数据量其实很多了。但对于触发字检测,也许只有1小时数据,所以这数据太小,不能用来拟合很多参数。所以在这种情况下,预先学到很多人类声音的特征人类语言的组成部分等等知识,可以帮建立一个很好的唤醒字检测器,即使的数据集相对较小。对于唤醒词任务来说,至少数据集要小得多。
所以在这两种情况下,从数据量很多的问题迁移到数据量相对小的问题。然后反过来的话,迁移学习可能就没有意义了。比如,用100张图训练图像识别系统,然后有100甚至1000张图用于训练放射科诊断系统,人们可能会想,为了提升放射科诊断的性能,假设真的希望这个放射科诊断系统做得好,那么用放射科图像训练可能比使用猫和狗的图像更有价值,所以这里(100甚至1000张图用于训练放射科诊断系统)的每个样本价值比这里(100张图训练图像识别系统)要大得多,至少就建立性能良好的放射科系统而言是这样。所以,如果的放射科数据更多,那么这100张猫猫狗狗或者随机物体的图片肯定不会有太大帮助,因为来自猫狗识别任务中,每一张图的价值肯定不如一张\(X\)射线扫描图有价值,对于建立良好的放射科诊断系统而言是这样。
所以,这是其中一个例子,说明迁移学习可能不会有害,但也别指望这么做可以带来有意义的增益。同样,如果用10小时数据训练出一个语音识别系统。然后实际上有10个小时甚至更多,比如说50个小时唤醒字检测的数据,知道迁移学习有可能会有帮助,也可能不会,也许把这10小时数据迁移学习不会有太大坏处,但是也别指望会得到有意义的增益。
所以总结一下,什么时候迁移学习是有意义的?如果想从任务\(A\)学习并迁移一些知识到任务\(B\),那么当任务\(A\)和任务\(B\)都有同样的输入\(x\)时,迁移学习是有意义的。在第一个例子中,\(A\)和\(B\)的输入都是图像,在第二个例子中,两者输入都是音频。当任务\(A\)的数据比任务\(B\)多得多时,迁移学习意义更大。所有这些假设的前提都是,希望提高任务\(B\)的性能,因为任务\(B\)每个数据更有价值,对任务\(B\)来说通常任务\(A\)的数据量必须大得多,才有帮助,因为任务\(A\)里单个样本的价值没有比任务\(B\)单个样本价值大。然后如果觉得任务\(A\)的低层次特征,可以帮助任务\(B\)的学习,那迁移学习更有意义一些。
而在这两个前面的例子中,也许学习图像识别教给系统足够多图像相关的知识,让它可以进行放射科诊断,也许学习语音识别教给系统足够多人类语言信息,能帮助开发触发字或唤醒字检测器。
所以总结一下,迁移学习最有用的场合是,如果尝试优化任务B的性能,通常这个任务数据相对较少,例如,在放射科中知道很难收集很多\(X\)射线扫描图来搭建一个性能良好的放射科诊断系统,所以在这种情况下,可能会找一个相关但不同的任务,如图像识别,其中可能用1百万张图片训练过了,并从中学到很多低层次特征,所以那也许能帮助网络在任务\(B\)在放射科任务上做得更好,尽管任务\(B\)没有这么多数据。迁移学习什么时候是有意义的?它确实可以显著提高的学习任务的性能,但有时候也见过有些场合使用迁移学习时,任务\(A\)实际上数据量比任务\(B\)要少,这种情况下增益可能不多。
机器学习:详解迁移学习(Transfer learning)的更多相关文章
- 【转载】 迁移学习(Transfer learning),多任务学习(Multitask learning)和端到端学习(End-to-end deep learning)
--------------------- 作者:bestrivern 来源:CSDN 原文:https://blog.csdn.net/bestrivern/article/details/8700 ...
- 【深度学习系列】迁移学习Transfer Learning
在前面的文章中,我们通常是拿到一个任务,譬如图像分类.识别等,搜集好数据后就开始直接用模型进行训练,但是现实情况中,由于设备的局限性.时间的紧迫性等导致我们无法从头开始训练,迭代一两百万次来收敛模型, ...
- 迁移学习-Transfer Learning
迁移学习两种类型: ConvNet as fixed feature extractor:利用在大数据集(如ImageNet)上预训练过的ConvNet(如AlexNet,VGGNet),移除最后几层 ...
- zz详解深度学习中的Normalization,BN/LN/WN
详解深度学习中的Normalization,BN/LN/WN 讲得是相当之透彻清晰了 深度神经网络模型训练之难众所周知,其中一个重要的现象就是 Internal Covariate Shift. Ba ...
- 机器学习 | 详解GBDT在分类场景中的应用原理与公式推导
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第31篇文章,我们一起继续来聊聊GBDT模型. 在上一篇文章当中,我们学习了GBDT这个模型在回归问题当中的原理.GBD ...
- 《Node.js开发实战详解》学习笔记
<Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...
- 【机器学习详解】SMO算法剖析(转载)
[机器学习详解]SMO算法剖析 转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/51227754 CSDN−勿在浮沙筑高台 本文力 ...
- pytorch例子学习——TRANSFER LEARNING TUTORIAL
参考:https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html 以下是两种主要的迁移学习场景 微调convnet : ...
- Android Binder IPC详解-Android学习之旅(96)
linux内存空间与BInder Driver Android进程和linux进程一样,他们只运行在进程固有的虚拟空间中.一个4GB的虚拟地址空间,其中3GB是用户空间,1GB是内核空间 ,用户空间是 ...
- Android系统服务详解-android学习之旅(95)
本文是看完android框架揭秘第六章后的总结 android系统服务提供最基本的,最稳定的核心功能,如设备控制,信息通知,通知设定,以及消息显示等,存在于Android Framework与Andr ...
随机推荐
- 推荐一款模拟浏览器自动化操作神器!Mechanize
大家好,我是狂师! 今天给大家推荐一款用于模拟浏览器行为以进行网页自动化操作Python库:Mechanize. 1.介绍 Mechanize是Python中的一个库,它被设计用来自动化网页浏览和数据 ...
- EDP .Net开发框架--自动化日志
平台下载地址:https://gitee.com/alwaysinsist/edp 自动化日志不需要额外调用日志相关功能即可无感实现程序集方法调用的日志记录. 创建业务逻辑处理类 public cla ...
- 【题解】P2627 [USACO11OPEN] Mowing the Lawn G
[题解]P2627 [USACO11OPEN] Mowing the Lawn G 题目跳转 数据量比较大,暴力肯定是不行的.只能考虑用动态规划的方式来做. 这道题有许多dp设计的思路,这里提供两个: ...
- 使用EntityFramework Core和Enums作为字符串的ASP.NET Core Razor页面——第三部分
目录 介绍 使用代码 添加项目和项目状态处理 下载源文件 - 989.1 KB 介绍 这是一篇由多部分组成的文章的第三部分,演示了通过EntityFramework Core 2.1(EF)将C#en ...
- Flask-Limit详细说明:接口限流
速率限制通常作为服务的防御措施予以实施.服务需要保护自身以免过度使用(无论是有意还是无意),从而保持服务可用性.在Flask项目开发过程中,遇到了需要对接口进行限制的需求,又不想去造轮子,这时候就需要 ...
- 鸿蒙HarmonyOS实战-Web组件(Cookie及数据存储)
前言 Cookie是一种存储在用户计算机上的小文本文件,用于在用户访问网站时存储和提取信息.它由网站服务器发送到用户的浏览器,并存储在用户的计算机上.每当用户访问该网站时,浏览器将发送该Cookie回 ...
- 数据结构之栈(Java,C语言的实现)以及相关习题巩固
目录 栈 概念以及代码实现 例题 232. 用栈实现队列 1614. 括号的最大嵌套深度 234. 回文链表 1614. 括号的最大嵌套深度 LCR 123. 图书整理 I 206. 反转链表 402 ...
- 语义化结构标签 多媒体标签 H5新增表单内容
语义化结构标签: section 更偏向于一个区域类似div(块) article 更偏向于显示内容(块) aside 标签作为article呢绒的辅助板块(块) header 标签做为一个网页头部 ...
- redux中集成immutable.js
安装redux-immutable redux中利用combineReducers来合并reducer并初始化state,redux自带的combineReducers只支持state是原生js形式的 ...
- LeetCode 621. 任务调度器 (Java)
题目: 给定一个用字符数组表示的 CPU 需要执行的任务列表.其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务.任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完.C ...