2016年,图灵奖得主Yann LeCun 表示,未来几年的挑战是让机器学会从原始的、没有标签的数据中学习知识,即无监督学习。Yann LeCun提出,无监督学习是人工智能的下一站。2020年,图灵奖得主Geoffrey E. Hinton指出,人类无法完全依赖有监督学习的方法完成所有神经元训练,而需要更多来自于无监督学习的帮助。目前无监督学习技术备受关注,无监督表达学习技术在自然语言处理领域进展神速,OpenAI 近期发布的包含1700亿参数的GPT-3预训练模型吸引了全世界的目光;无监督图嵌入表达技术在图学习领域取得了不俗的成果;自监督学习技术在视觉领域近期也有较大的突破,Geoffrey E. Hinton 等谷歌研究者的最新研究一次就把无监督学习的指标提升了 7-10%,甚至可以媲美有监督学习的效果。但我们同时也看到,对GPT-3的质疑声一直不断,无监督学习技术在更多的领域尚待突破。2020年8月22日,中国计算机学会青年计算机科技论坛深圳分论坛主办大湾区IT创新论坛“无监督学习,如何成为人工智能的下一站?”。
本次论坛吸引了超过1千人通过线下会场、腾讯会议及B站全程参与,包括涉及表达学习、自然语言处理、计算机视觉分析、数据挖掘、金融大数据处理等众多相关领域的青年学者、相关行业从业者及在读学生,共同思辨无监督学习技术如何真的能成为人工智能的下一站。在论坛的思辨环节,大家充分交流了自己对无监督学习当前发展及未来趋势的看法,并围绕三个议题展开了精彩的讨论。这三个议题分别对应于无监督的益处、多模态场景和鲁棒性。以下是邀请嘉宾及参与者的相关论点,AI科技评论进行了不改变原意的整理。除了图像与视频的识别、检测与分割,其实视觉领域还有许多子任务,比方说:底层任务有图像的修复,中层任务有检测图像深度的估计,更上一层的任务包括图像里物体之间的关系预测,以及从图像到语句的生成或者视觉问答等等。 各种各样的视觉任务都非常依赖于视觉特征的表达。自深度学习崛起后,由于在下游的任务中不可能搜集关于该任务的各种特定的数据进行训练,所以视觉特征的表达越来越依赖于预训练的模型。预训练模型指的是一个已训练好的、保存下来的网络,该网络通常已在一些大型数据集上进行了训练。目前一些比较著名的预训练模型包括:计算机视觉领域的VGG16、Mask R-CNN和自然语言处理领域的BERT、GPT-3等等。在视觉的预训练模型上,2009年出现了一个大规模数据集——ImageNet,所以大家普遍使用在ImageNet上的预训练模型,然后再在其他子任务上进行训练。 但是,通过ImageNet进行预训练的模型存在一些缺陷:1)预训练依赖ImageNet,但ImageNet的数据量毕竟是有限的;2)ImageNet的标签是人工设计的,因此可能存在着一些数据的偏差;3)关于下游任务(即前面提到的各种各样的视觉任务),不同的下游任务有不同的特性,那么在ImageNet上预训练的模型在处理不同的下游任务时,可能会表现出不同的能力与特征;4)ImageNet数据集由人工来打标签,需要耗费巨大的人力物力,数据的扩展非常困难,而且预训练模型的训练与人的学习机制是相违悖的,人的学习不依赖于大量的标签数据来实现泛化能力。因此,近几年,研究人员逐渐转向利用无监督或自监督的方法去学习更好的预训练模型。在视觉领域,自监督模型的核心思想是设计各种各样的前置任务(pre-tasks)。这种前置任务可以是基于生成式的,也可以是基于判别式的。基于生成式的前置任务是说:抹掉图的部分内容,然后去预测所抹掉的部分;或是把图转成灰色图,去预测图的彩色模样;或是观察视频的前几帧,去预测这段视频的下一帧。例如,Image GPT是像语句一样把图像看作一个像素的序列,通过基于前面的像素去预测后面的像素。另一种是基于判别式的,即设计一个分类任务,把一张图打散成块状,然后去预测序列的分类。或者是,对图像做一些更改,然后判别图像经过了哪几种不同的变化。根据现在的研究,在分类任务上,基于判别式的预训练模型所取得的结果比基于生成式的预训练模型更好。近几年,关于对比学习的方法(基于三元组分类的方式)受到了广泛关注,它比生成式的方法取得了更好的性能。根据最新的NeurIPS投稿,在图像分类方面,基于自监督的预训练模型的准确率与基于全监督ImageNet的预训练模型的准确率差距(gap)缩小到了大约2%以内。在视频方面,自监督预训练一般是用视频的前几帧去预测视频的下一帧,这时,自监督模型与全监督模型之间的的gap比图像分类任务要大一些。进一步的研究发现,如果把视频的预训练数据扩展到多模态数据,例如视频加上声音或各种语言,然后再去设定前置任务,这时候预训练的模型在执行视频的下游任务时,性能可能会更好一点,gap大概可以缩小到5%以内。总的来说,这种基于自监督的预训练模型是当前视觉领域的研究热点之一,预计在未来也会慢慢替代基于监督的预训练模型。
无监督学习的益处
议题一:哪些领域更可能从无监督预训练模型中受益?无监督预训练模型的学习偏见如何解决?使用无监督预训练模型的最主要领域是CV和NLP,在CV和NLP领域里面,哪些细分领域更可能从无监督预训练模型中受益呢?以及无监督预训练模型的学习偏见如何解决?从CV角度来看,刚刚提到,自监督的预训练模型在执行图像分类时最好的研究结果是,与监督预训练模型之间的Gap只有2%。但最近Facebook提出了一个最新的模型叫MoCo(动量对比学习)。研究人员发现,虽然自监督预训练模型比基于全监督的模型相差2%的gap,但在执行CV的下游任务(包括图像的分割、检测与小样本学习)时,自监督预训练模型比基于全监督的预训练模型表现更好。也就是说,虽然自监督在ImageNet的分类任务上没有表现地特别好,但它比监督模型更适合执行下游任务,普适性和鲁棒性更佳。从NLP角度来看,更好的泛化性也存在。现在的大趋势是:如果不使用大规模的无监督学习方法,基本上研究就无法继续。在NLP领域,所有的问题都得从大规模无监督模型开始,然后基于无监督模型进行后续的任务,否则性能肯定上不去。所以结论是:NLP领域的所有研究问题基本上都会受益于无监督预训练模型,但无监督模型在实际应用系统上的表现则带有不确定性,因为涉及到许多其他方面。从深度聚类角度来看,影响聚类性能的要素在于特征表示。但有一个问题是:在聚类的过程中,因为没有标签,所以没有办法继续对损失进行定义。在这个过程中,我们一般是先基于一个模型对输入进行初始化,然后基于性能好的autoencoder来学习聚类中心。如果聚类中心和特征同时学习,模型可能会漂移,而且不知道会漂到什么地方。所以,在预训练过程中,要先只学习一个聚类中心,然后保持中心不变,再去学特征。就相当于,在一开始,通过预训练得到一个中心,然后把这个聚类中心固定,再通过预训练来学习特征表达,最后用特征表达做聚类。 此外,无监督预训练的偏见问题产生,涉及到很多因素,比如样本没有选好。最近有研究发现,在无监督预训练中,数据并不是越多越好。要根据任务细心选择数据,使训练样本和目标样本的匹配度更高。否则的话,就算数据量达到了要求,但进行预训练之后,它的效果反而会下降。 对于模型偏见,可以通过引入一个重构误差,然后用重构误差和聚类损失的折中来限制特征学习。就是说,不要为了减少损失而跑偏,最后导致聚类结果反而不好。我们可以用新知识,比如重构误差,来限制模型的学习,防止在训练过程中跑偏。
多模态场景
议题二:无监督学习技术如何促进多模态场景下不同领域之间知识的交互以提升性能?真实的数据不只涉及文本,还有语音、视频等等,在这种多模态场景下,我们会思考无监督学习技术的应用。不同领域的知识一定要进行交互,只有交互才能引入其它领域的知识来提高任务的性能,那么,无监督学习技术如何促进不同领域知识之间的交互,最终提升性能呢?
道翰天琼CiGril认知智能机器人API用户需要按步骤获取基本信息:
在平台注册账号登录平台,进入后台管理页面,创建应用,然后查看应用,查看应用相关信息。在应用信息页面,找到appid,appkey秘钥等信息,然后写接口代码接入机器人应用。请求地址:http://www.weilaitec.com/cigirlrobot.cgr
请求方式:post
请求参数:
参数
类型
默认值
描述
userid
String
无
平台注册账号
appid
String
无
平台创建的应用id
key
String
无
平台应用生成的秘钥
msg
String
""
用户端消息内容
ip
String
""
客户端ip要求唯一性,无ip等可以用QQ账号,微信账号,手机MAC地址等代替。
接口连接示例:http://www.weilaitec.com/cigirlrobot.cgr?key=UTNJK34THXK010T566ZI39VES50BLRBE8R66H5R3FOAO84J3BV&msg=你好&ip=119.25.36.48&userid=jackli&appid=52454214552 注意事项:参数名称都要小写,五个参数不能遗漏,参数名称都要写对,且各个参数的值不能为空字符串。否则无法请求成功。userid,appid,key三个参数要到平台注册登录创建应用之后,然后查看应用详情就可以看到。userid就是平台注册账号。
示例代码JAVA:
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class apitest { /** * Get请求,获得返回数据 * @param urlStr * @return */ private static String opUrl(String urlStr) { URL url = null; HttpURLConnection conn = null; InputStream is = null; ByteArrayOutputStream baos = null; try { url = new URL(urlStr); conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(5 * 10000); conn.setConnectTimeout(5 * 10000); conn.setRequestMethod("POST"); if (conn.getResponseCode() == 200) { is = conn.getInputStream(); baos = new ByteArrayOutputStream(); int len = -1; byte[] buf = new byte[128]; while ((len = is.read(buf)) != -1) { baos.write(buf, 0, len); } baos.flush(); String result = baos.toString(); return result; } else { throw new Exception("服务器连接错误!"); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (is != null) is.close(); } catch (IOException e) { e.printStackTrace(); } try { if (baos != null) baos.close(); } catch (IOException e) { e.printStackTrace(); } conn.disconnect(); } return ""; } public static void main(String args []){ //msg参数就是传输过去的对话内容。 System.out.println(opUrl("http://www.weilaitec.com/cigirlrobot.cgr?key=UTNJK34THXK010T566ZI39VES50BLRBE8R66H5R3FOAO84J3BV&msg=你好&ip=119.25.36.48&userid=jackli&appid=52454214552")); } }