科学网

 找回密码
  注册
科学网 标签 深度学习 相关日志

tag 标签: 深度学习

相关日志

如何用 Python 和 Tensorflow 2.0 神经网络分类表格数据?
热度 1 wshuyi 2019-4-15 11:51
以客户流失数据为例,看 Tensorflow 2.0 版本如何帮助我们快速构建表格(结构化)数据的神经网络分类模型。 变化 表格数据,你应该并不陌生。毕竟, Excel 这东西在咱们平时的工作和学习中,还是挺常见的。 在之前的教程里,我为你分享过, 如何利用深度神经网络,锁定即将流失的客户 。里面用到的,就是这样的表格数据。 时间过得真快,距离写作那篇教程,已经一年半了。 这段时间里,出现了 2个重要的变化 ,使我觉得有必要重新来跟你谈谈这个话题。 这两个变化分别是: 首先,tflearn 框架的开发已经不再活跃。 tflearn 是当时教程中我们使用的高阶深度学习框架,它基于 Tensorflow 之上,包裹了大量的细节,让用户可以非常方便地搭建自己的模型。 但是,由于 Tensorflow 选择拥抱了它的竞争者 Keras ,导致后者的竞争优势凸显。 对比二者获得的星数,已经不在同一量级。 观察更新时间,tflearn 已经几个月没有动静;而 Keras 几个小时之前,还有更新。 我们选择免费开源框架,一定要使用 开发活跃 、 社区支持完善 的。只有这样,遇到问题才能更 低成本、高效率 地解决。 看过我的《 Python编程遇问题,文科生怎么办? 》一文之后,你对上述结论,应该不陌生。 另一项新变化,是 Tensorflow 发布了 2.0 版本。 相对 1.X 版本,这个大版本的变化,我在《 如何用 Python 和 BERT 做中文文本二元分类? 》一文中,已经粗略地为你介绍过了。简要提炼一下,就是: 之前的版本,以计算图为中心。开发者需要为这张图服务。因此,引入了大量的不必要术语。新版本以人为中心,用户撰写高阶的简洁语句,框架自动将其转化为对应的计算图。 之前的版本,缺少目前竞争框架(如 PyTorch 等)包含的新特性。例如计算图动态化、运行中调试功能等。 但对普通开发者来说,最为重要的是,官方文档和教程变得对用户 友好 许多。不仅写得 清晰简明 ,更靠着 Google Colab 的支持,全都能 一键运行 。我尝试了 2.0 版本的一些教程样例,确实感觉大不一样了。 其实你可能会觉得奇怪—— Tensorflow 大张旗鼓宣传的大版本改进,其实也无非就是向着 PyTorch 早就有 的功能靠拢而已嘛。那我干脆去学 PyTorch 好了! 如果我们只说道理,这其实没错。然而,还是前面那个论断,一个框架好不好,主要看是否 开发活跃 、 社区支持完善 。这就是一个自证预言。一旦人们都觉得 Tensorflow 好用,那么 Tensorflow 就会更好用。因为会有更多的人参与进来,帮助反馈和改进。 看看现在 PyTorch 的 Github 页面。 受关注度,确实已经很高了。 然而你再看看 Tensorflow 的。 至少在目前,二者根本不在一个数量级。 Tensorflow 的威力,不只在于本身构建和训练模型是不是好用。那其实只是深度学习中, 非常小 的一个环节。不信?你在下图里找找看。 真正的问题,在于是否有完整的 生态环境 支持。其中的逻辑,我在《 学 Python ,能提升你的竞争力吗? 》一文中,已经为你详细分析过了。 而 Tensorflow ,早就通过一系列的布局,使得其训练模型可以直接快速部署,最快速度铺开,帮助开发者占领市场先机。 如果你使用 PyTorch ,那么这样的系统,是 相对不完善 的。当然你可以在 PyTorch 中训练,然后转换并且部署到 Tensorflow 里面。毕竟三巨头达成了协议,标准开放,这样做从技术上并不困难。 但是,人的 认知带宽 ,是非常 有限 的。大部分人,是不会选择在两个框架甚至生态系统之间折腾的。这就是 路径依赖 。 所以,别左顾右盼了,认认真真学 Tensorflow 2.0 吧。 这篇文章里面,我给你介绍,如何用 Tensorflow 2.0 ,来训练神经网络,对用户流失数据建立分类模型,从而可以帮你见微知著,洞察风险,提前做好干预和防范。 数据 你手里拥有的,是一份银行欧洲区客户的数据,共有10000条记录。客户主要分布在法国、德国和西班牙。 数据来自于匿名化处理后的真实数据集,下载自 superdatascience 官网 。 从表格中,可以读取的信息,包括客户们的年龄、性别、信用分数、办卡信息等。客户是否已流失的信息在最后一列(Exited)。 这份数据,我已经上传到了 这个地址 ,你可以下载,并且用 Excel 查看。 环境 本文的配套源代码,我放在了 这个 Github 项目 中。请你点击 这个链接 ( http://t.cn/EXffmgX )访问。 如果你对我的教程满意,欢迎在页面右上方的 Star 上点击一下,帮我加一颗星。谢谢! 注意这个页面的中央,有个按钮,写着“在 Colab 打开” (Open in Colab)。请你点击它。 然后,Google Colab 就会自动开启。 我建议你点一下上图中红色圈出的 “COPY TO DRIVE” 按钮。这样就可以先把它在你自己的 Google Drive 中存好,以便使用和回顾。 Colab 为你提供了全套的运行环境。你只需要依次执行代码,就可以复现本教程的运行结果了。 如果你对 Google Colab 不熟悉,没关系。我 这里有一篇教程 ,专门讲解 Google Colab 的特点与使用方式。 为了你能够更为深入地学习与了解代码,我建议你在 Google Colab 中开启一个全新的 Notebook ,并且根据下文,依次输入代码并运行。在此过程中,充分理解代码的含义。 这种看似笨拙的方式,其实是学习的 有效路径 。 代码 首先,我们下载客户流失数据集。 !wgethttps://raw.githubusercontent.com/wshuyi/demo-customer-churn-ann/master/customer_churn.csv 载入 Pandas 数据分析包。 import pandas as pd 利用 read_csv 函数,读取 csv 格式数据到 Pandas 数据框。 df=pd.read_csv( 'customer_churn.csv' ) 我们来看看前几行显示结果: df.head() 显示正常。下面看看一共都有哪些列。 df.columns 我们对所有列,一一甄别。 RowNumber:行号,这个对于模型没用,忽略 CustomerID:用户编号,这个是顺序发放的,忽略 Surname:用户姓名,对流失没有影响,忽略 CreditScore:信用分数,这个很重要,保留 Geography:用户所在国家/地区,这个有影响,保留 Gender:用户性别,可能有影响,保留 Age:年龄,影响很大,年轻人更容易切换银行,保留 Tenure:当了本银行多少年用户,很重要,保留 Balance:存贷款情况,很重要,保留 NumOfProducts:使用产品数量,很重要,保留 HasCrCard:是否有本行信用卡,很重要,保留 IsActiveMember:是否活跃用户,很重要,保留 EstimatedSalary:估计收入,很重要,保留 Exited:是否已流失,这将作为我们的标签数据 确定了不同列的含义和价值,下面我们处理起来,就得心应手了。 数据有了,我们来调入深度学习框架。 因为本次我们需要使用 Tensorflow 2.0 ,而写作本文时,该框架版本尚处于 Alpha 阶段,因此 Google Colab 默认使用的,还是 Tensorflow 1.X 版本。要用 2.0 版,便需要显式安装。 !pipinstall-qtensorflow== 2.0 .0 -alpha0 安装框架后,我们载入下述模块和函数,后文会用到。 import numpy as np import tensorflow as tf from tensorflow import keras from sklearn.model_selection import train_test_split from tensorflow import feature_column 这里,我们设定一些随机种子值。这主要是为了保证结果可复现,也就是在你那边的运行结果,和我这里尽量保持一致。这样我们观察和讨论问题,会更方便。 首先是 Tensorflow 中的随机种子取值,设定为 1 。 tf.random.set_seed( 1 ) 然后我们来分割数据。这里使用的是 Scikit-learn 中的 train_test_split 函数。指定分割比例即可。 我们先按照 80:20 的比例,把总体数据分成 训练集 和 测试集 。 train,test=train_test_split(df,test_size= 0.2 ,random_state= 1 ) 然后,再把现有训练集的数据,按照 80:20 的比例,分成最终的训练集,以及 验证集 。 train,valid=train_test_split(train,test_size= 0.2 ,random_state= 1 ) 这里,我们都指定了 random_state ,为的是保证咱们随机分割的结果一致。 我们看看几个不同集合的长度。 print(len(train)) print(len(valid)) print(len(test)) 验证无误。下面我们来做 特征工程 (feature engineering)。 因为我们使用的是表格数据(tabular data),属于 结构化数据 。因此特征工程相对简单一些。 先初始化一个空的特征列表。 feature_columns= 可见,包含了以下列: CreditScore:信用分数 Age:年龄 Tenure:当了本银行多少年用户 Balance:存贷款情况 NumOfProducts:使用产品数量 EstimatedSalary:估计收入 对于这些列,只需要直接指定类型,加入咱们的特征列表就好。 for header in numeric_columns: feature_columns.append(feature_column.numeric_column(header)) 下面是比较讲究技巧的部分了,就是类别数据。 先看看都有哪些列: categorical_columns= Geography:用户所在国家/地区 Gender:用户性别 HasCrCard:是否有本行信用卡 IsActiveMember:是否活跃用户 类别数据的特点,在于不能直接用数字描述。例如 Geography 包含了国家/地区名称。如果你把法国指定为1, 德国指定为2,电脑可能自作聪明,认为“德国”是“法国”的2倍,或者,“德国”等于“法国”加1。这显然不是我们想要表达的。 所以我这里编了一个函数,把一个类别列名输入进去,让 Tensorflow 帮我们将其转换成它可以识别的类别形式。例如把法国按照 ,德国按照 来表示。这样就不会有数值意义上的歧义了。 def get_one_hot_from_categorical (colname) : categorical=feature_column.categorical_column_with_vocabulary_list(colname,train .unique().tolist()) return feature_column.indicator_column(categorical) 我们尝试输入 Geography 一项,测试一下函数工作是否正常。 geography=get_one_hot_from_categorical( 'Geography' );geography 观察结果,测试通过。 下面我们放心大胆地把所有类别数据列都在函数里面跑一遍,并且把结果加入到特征列表中。 for col in categorical_columns: feature_columns.append(get_one_hot_from_categorical(col)) 看看此时的特征列表内容: feature_columns 6个数值类型,4个类别类型,都没问题了。 下面该构造模型了。 我们直接采用 Tensorflow 2.0 鼓励开发者使用的 Keras 高级 API 来拼搭一个简单的深度神经网络模型。 from tensorflow.keras import layers 我们把刚刚整理好的特征列表,利用 DenseFeatures 层来表示。把这样的一个初始层,作为模型的整体输入层。 feature_layer=layers.DenseFeatures(feature_columns);feature_layer 下面,我们顺序叠放两个中间层,分别包含200个,以及100个神经元。这两层的激活函数,我们都采用 relu 。 relu 函数大概长这个样子: model=keras.Sequential( ) 我们希望输出结果是0或者1,所以这一层只需要1个神经元,而且采用的是 sigmoid 作为激活函数。 sigmoid 函数的长相是这样的: 模型搭建好了,下面我们指定3个重要参数,编译模型。 model.compile(optimizer= 'adam' , loss= 'binary_crossentropy' , metrics= ) 这里,我们选择优化器为 adam 。 因为评判二元分类效果,所以损失函数选的是 binary_crossentropy 。 至于效果指标,我们使用的是准确率(accuracy)。 模型编译好之后。万事俱备,只差数据了。 你可能纳闷,一上来不就已经把训练、验证和测试集分好了吗? 没错,但那只是原始数据。我们模型需要接收的,是 数据流 。 在训练和验证过程中,数据都不是一次性灌入模型的。而是一批次一批次分别载入。每一个批次,称作一个 batch ;相应地,批次大小,叫做 batch_size 。 为了方便咱们把 Pandas 数据框中的原始数据转换成数据流。我这里编写了一个函数。 def df_to_tfdata (df,shuffle=True,bs= 32 ) : df=df.copy() labels=df.pop( 'Exited' ) ds=tf.data.Dataset.from_tensor_slices((dict(df),labels)) if shuffle: ds=ds.shuffle(buffer_size=len(df),seed= 1 ) ds=ds.batch(bs) return ds 这里首先是把数据中的标记拆分出来。然后根据把数据读入到 ds 中。根据是否是训练集,我们指定要不要需要打乱数据顺序。然后,依据 batch_size 的大小,设定批次。这样,数据框就 变成了 神经网络模型喜闻乐见的 数据流 。 train_ds=df_to_tfdata(train) valid_ds=df_to_tfdata(valid,shuffle= False ) test_ds=df_to_tfdata(test,shuffle= False ) 这里,只有训练集打乱顺序。因为我们希望验证和测试集一直保持一致。只有这样,不同参数下,对比的结果才有显著意义。 有了模型架构,也有了数据,我们把训练集和验证集扔进去,让模型尝试拟合。这里指定了,跑5个完整轮次(epochs)。 model.fit(train_ds, validation_data=valid_ds, epochs= 5 ) 你会看到,最终的验证集准确率接近80%。 我们打印一下模型结构: model.summary() 虽然我们的模型非常简单,却也依然包含了23401个参数。 下面,我们把测试集放入模型中,看看模型效果如何。 model.evaluate(test_ds) 依然,准确率接近80%。 还不错吧? …… 真的吗? 疑惑 如果你观察很仔细,可能刚才已经注意到了一个很奇特的现象: 训练的过程中,除了第一个轮次外,其余4个轮次的这几项重要指标居然 都没变 ! 它们包括: 训练集损失 训练集准确率 验证集损失 验证集准确率 所谓机器学习,就是不断迭代改进啊。如果每一轮下来,结果都 一模一样 ,这难道不奇怪吗?难道没问题吗? 我希望你,能够像侦探一样,揪住这个可疑的线索,深入挖掘进去。 这里,我给你个提示。 看一个分类模型的好坏,不能只看准确率(accuracy)。对于二元分类问题,你可以关注一下 f1 score,以及混淆矩阵(confusion matrix)。 如果你验证了上述两个指标,那么你应该会发现真正的问题 是什么 。 下一步要穷究的,是问题产生的 原因 。 回顾一下咱们的整个儿过程,好像都很清晰明了,符合逻辑啊。究竟哪里出了问题呢? 如果你一眼就看出了问题。恭喜你,你对深度学习已经有感觉了。那么我继续追问你,该怎么解决这个问题呢? 欢迎你把思考后的答案在留言区告诉我。 对于第一名全部回答正确上述问题的读者,我会邀请你作为嘉宾,免费(原价199元)加入我本年度的知识星球。当然,前提是你愿意。 小结 希望通过本文的学习,你已掌握了以下知识点: Tensorflow 2.0 的安装与使用; 表格式数据的神经网络分类模型构建; 特征工程的基本流程; 数据集合的随机分割与利用种子数值保持一致; 数值型数据列与类别型数据列的分别处理方式; Keras 高阶 API 的模型搭建与训练; 数据框转化为 Tensorflow 数据流; 模型效果的验证; 缺失的一环,也即本文疑点产生的原因,以及正确处理方法。 希望本教程对于你处理表格型数据分类任务,能有帮助。 祝深度学习愉快! 延伸阅读 你可能也会对以下话题感兴趣。点击链接就可以查看。 如何高效学 Python ? 如何用 Python 和 fast.ai 做图像深度迁移学习? 如何用 Python 和深度迁移学习做文本分类? 如何用 Python 和 BERT 做中文文本二元分类? 《文科生数据科学上手指南》分享 喜欢请点赞和打赏。还可以微信关注和置顶我的公众号 “玉树芝兰”(nkwangshuyi) 。 如果你对 Python 与数据科学感兴趣,不妨阅读我的系列教程索引贴《 如何高效入门数据科学? 》,里面还有更多的有趣问题及解法。
7049 次阅读|1 个评论
如何用 Python 和 BERT 做中文文本二元分类?
wshuyi 2019-4-8 08:59
兴奋 去年, Google 的 BERT 模型一发布出来,我就很兴奋。 因为我当时正在用 fast.ai 的 ULMfit 做自然语言分类任务(还专门写了《 如何用 Python 和深度迁移学习做文本分类? 》一文分享给你)。ULMfit 和 BERT 都属于预训练语言模型(Pre-trained Language Modeling),具有很多的相似性。 所谓语言模型,就是利用深度神经网络结构,在海量语言文本上训练,以抓住一种语言的 通用特征 。 上述工作,往往只有大机构才能完成。因为 花费 实在太大了。 这花费包括但不限于: 存数据 买(甚至开发)运算设备 训练模型(以天甚至月计) 聘用专业人员 …… 预训练 就是指他们训练好之后,把这种结果开放出来。我们普通人或者小型机构,也可以 借用 其结果,在自己的专门领域文本数据上进行 微调 ,以便让模型对于这个专门领域的文本有非常清晰的 认识 。 所谓认识,主要是指你遮挡上某些词汇,模型可以较准确地猜出来你藏住了什么。 甚至,你把两句话放在一起,模型可以判断它俩是不是紧密相连的上下文关系。 这种“认识”有用吗? 当然有。 BERT 在多项自然语言任务上测试,不少结果已经超越了人类选手。 BERT 可以辅助解决的任务,当然也包括文本分类(classification),例如情感分类等。这也是我目前研究的问题。 痛点 然而,为了能用上 BERT ,我等了很久。 Google 官方代码早已开放。就连 Pytorch 上的实现,也已经迭代了多少个轮次了。 但是我只要一打开他们提供的样例,就头晕。 单单是那代码的行数,就非常吓人。 而且,一堆的数据处理流程(Data Processor) ,都用数据集名称命名。我的数据不属于上述任何一个,那么我该用哪个? 还有莫名其妙的无数旗标(flags) ,看了也让人头疼不已。 让我们来对比一下,同样是做分类任务,Scikit-learn 里面的语法结构是什么样的。 from sklearn.datasets import load_iris from sklearn import tree iris=load_iris() clf=tree.DecisionTreeClassifier() clf=clf.fit(iris.data,iris.target) 即便是图像分类这种数据吞吐量大,需要许多步骤的任务,你用 fast.ai ,也能几行代码,就轻轻松松搞定。 !gitclonehttps://github.com/wshuyi/demo-image-classification-fastai.git from fastai.vision import * path=Path( demo-image-classification-fastai/imgs/ ) data=ImageDataBunch.from_folder(path,test= 'test' ,size= 224 ) learn=cnn_learner(data,models.resnet18,metrics=accuracy) learn.fit_one_cycle( 1 ) interp=ClassificationInterpretation.from_learner(learn) interp.plot_top_losses( 9 ,figsize=( 8 , 8 )) 别小瞧这几行代码,不仅帮你训练好一个图像分类器,还能告诉你,那些分类误差最高的图像中,模型到底在关注哪里。 对比一下,你觉得 BERT 样例和 fast.ai 的样例区别在哪儿? 我觉得,后者是 给人用的 。 教程 我总以为,会有人把代码重构一下,写一个简明的教程。 毕竟,文本分类任务是个常见的机器学习应用。应用场景多,也适合新手学习。 但是,这样的教程,我就是没等来。 当然,这期间,我也看过很多人写的应用和教程。 有的就做到把一段自然语言文本,转换到 BERT 编码。戛然而止。 有的倒是认真介绍怎么在官方提供的数据集上,对 BERT 进行“稍微修改”使用。所有的修改,都在原始的 Python 脚本上完成。那些根本没用到的函数和参数,全部被保留。至于别人如何复用到自己的数据集上?人家根本没提这事儿。 我不是没想过从头啃一遍代码。想当年读研的时候,我也通读过仿真平台上 TCP 和 IP 层的全部 C 代码。我确定眼前的任务,难度更低一些。 但是我真的懒得做。我觉得自己被 Python 机器学习框架,特别是 fast.ai 和 Scikit-learn 宠坏了。 后来, Google 的开发人员把 BERT 弄到了 Tensorflow Hub 上。还专门写了个 Google Colab Notebook 样例。 看到这个消息,我高兴坏了。 我尝试过 Tensorflow Hub 上的不少其他模型。使用起来很方便。而 Google Colab 我已在《 如何用 Google Colab 练 Python? 》一文中介绍给你,是非常好的 Python 深度学习练习和演示环境。满以为双剑合璧,这次可以几行代码搞定自己的任务了。 且慢。 真正打开一看,还是以样例数据为中心。 普通用户需要什么?需要一个接口。 你告诉我输入的标准规范,然后告诉我结果都能有什么。即插即用,完事儿走人。 一个文本分类任务,原本不就是给你个训练集和测试集,告诉你训练几轮练多快,然后你告诉我准确率等结果吗? 你至于让我为了这么简单的一个任务,去读几百行代码,自己找该在哪里改吗? 好在,有了这个样例做基础,总比没有好。 我耐下心来,把它整理了一番。 声明一下,我并没有对原始代码进行大幅修改。 所以不讲清楚的话,就有剽窃嫌疑,也会被鄙视的。 这种整理,对于会 Python 的人来说,没有任何技术难度。 可正因为如此,我才生气。这事儿难做吗?Google 的 BERT 样例编写者怎么就不肯做? 从 Tensorflow 1.0 到 2.0,为什么变动会这么大?不就是因为 2.0 才是给人用的吗? 你不肯把界面做得清爽简单,你的竞争者(TuriCreate 和 fast.ai)会做,而且做得非常好。实在坐不住了,才肯降尊纡贵,给普通人开发一个好用的界面。 教训啊!为什么就不肯吸取呢? 我给你提供一个 Google Colab 笔记本样例,你可以轻易地替换上自己的数据集来运行。你需要去理解(包括修改)的代码, 不超过10行 。 我先是测试了一个英文文本分类任务,效果很好。于是写了 一篇 Medium 博客 ,旋即被 Towards Data Science 专栏收录了。 Towards Data Science 专栏编辑给我私信,说: Very interesting, I like this considering the default implementation is not very developer friendly for sure. 有一个读者,居然连续给这篇文章点了50个赞(Claps),我都看呆了。 看来,这种忍受已久的痛点,不止属于我一个人。 估计你的研究中,中文分类任务可能遇到得更多。所以我干脆又做了一个中文文本分类样例,并且写下这篇教程,一并分享给你。 咱们开始吧。 代码 请点击 这个链接 ,查看我在 Github 上为你做好的 IPython Notebook 文件。 Notebook 顶端,有个非常明显的 Open in Colab 按钮。点击它,Google Colab 就会自动开启,并且载入这个 Notebook 。 我建议你点一下上图中红色圈出的 “COPY TO DRIVE” 按钮。这样就可以先把它在你自己的 Google Drive 中存好,以便使用和回顾。 这件事做好以后,你实际上只需要执行下面三个步骤: 你的数据,应该以 Pandas 数据框形式组织。如果你对 Pandas 不熟悉,可以参考我的 这篇文章 。 如有必要,可以调整训练参数。其实主要是训练速率(Learning Rate)和训练轮数(Epochs)。 执行 Notebook 的代码,获取结果。 当你把 Notebook 存好之后。定睛一看,或许会觉得上当了。 老师你骗人!说好了不超过10行代码的! 别急 。 在下面这张图红色圈出的这句话之前,你 不用修改任何内容 。 请你点击这句话所在位置,然后从菜单中如下图选择 Run before 。 下面才都是紧要的环节,集中注意力。 第一步,就是把数据准备好。 !wgethttps://github.com/wshuyi/demo-chinese-text-binary-classification- with -bert/raw/master/dianping_train_test.pickle with open( dianping_train_test.pickle , 'rb' ) as f: train,test=pickle.load(f) 这里使用的数据,你应该并不陌生。它是餐饮点评情感标注数据,我在《 如何用Python和机器学习训练中文文本情感分类模型? 》和《 如何用 Python 和循环神经网络做中文文本分类? 》中使用过它。只不过,为了演示的方便,这次我把它输出为 pickle 格式,一起放在了演示 Github repo 里,便于你下载和使用。 其中的训练集,包含1600条数据;测试集包含400条数据。标注里面1代表正向情感,0代表负向情感。 利用下面这条语句,我们把训练集重新洗牌(shuffling),打乱顺序。以避免过拟合(overfitting)。 train=train.sample(len(train)) 这时再来看看我们训练集的头部内容。 train.head() 如果你后面要替换上自己的数据集,请注意格式。训练集和测试集的列名称应该保持一致。 第二步,我们来设置参数。 myparam={ DATA_COLUMN : comment , LABEL_COLUMN : sentiment , LEARNING_RATE : 2e-5 , NUM_TRAIN_EPOCHS : 3 , bert_model_hub : https://tfhub.dev/google/bert_chinese_L-12_H-768_A-12/1 } 前两行,是把文本、标记对应的列名,指示清楚。 第三行,指定训练速率。你可以阅读原始论文,来进行超参数调整尝试。或者,你干脆保持默认值不变就可以。 第四行,指定训练轮数。把所有数据跑完,算作一轮。这里使用3轮。 最后一行,是说明你要用的 BERT 预训练模型。咱们要做中文文本分类,所以使用的是这个中文预训练模型地址。如果你希望用英文的,可以参考 我的 Medium 博客文章 以及对应的 英文样例代码 。 最后一步,我们依次执行代码就好了。 result,estimator=run_on_dfs(train,test,**myparam) 注意,执行这一句,可能需要 花费一段时间 。做好心理准备。这跟你的数据量和训练轮数设置有关。 在这个过程中,你可以看到,程序首先帮助你把原先的中文文本,变成了 BERT 可以理解的输入数据格式。 当你看到下图中红色圈出文字时,就意味着训练过程终于结束了。 然后你就可以把测试的结果打印出来了。 pretty_print(result) 跟咱们之前的 教程 (使用同一数据集)对比一下。 当时自己得写那么多行代码,而且需要跑10个轮次,可结果依然没有超过 80% 。这次,虽然只训练了3个轮次,但准确率已经超过了 88% 。 在这样小规模数据集上,达到这样的准确度,不容易。 BERT 性能之强悍 ,可见一斑。 小结 讲到这里,你已经学会了如何用 BERT 来做中文文本二元分类任务了。希望你会跟我一样开心。 如果你是个资深 Python 爱好者,请帮我个忙。 还记得这条线之前的代码吗? 能否帮我把它们打个包?这样咱们的演示代码就可以更加短小精悍和清晰易用了。 欢迎在 咱们的 Github 项目 上提交你的代码。如果你觉得这篇教程对你有帮助,欢迎给 这个 Github 项目 加颗星。谢谢! 祝深度学习愉快! 延伸阅读 你可能也会对以下话题感兴趣。点击链接就可以查看。 如何高效学 Python ? 学 Python ,能提升你的竞争力吗? 文科生如何理解卷积神经网络? 文科生如何理解循环神经网络(RNN)? 《文科生数据科学上手指南》分享 喜欢请点赞和打赏。还可以微信关注和置顶我的公众号 “玉树芝兰”(nkwangshuyi) 。 如果你对 Python 与数据科学感兴趣,不妨阅读我的系列教程索引贴《 如何高效入门数据科学? 》,里面还有更多的有趣问题及解法。
6778 次阅读|0 个评论
图灵奖和人工智能- Turing Award Won by 3 Pioneers in Artificial Intel
jhsbj 2019-3-31 17:32
纽约时报报道,2019年3月27号 美国计算机学会宣布将 2018 年度图灵奖授予人工智能领域的科学家:蒙特利尔大学教授本吉奥(Yoshua Bengio), 纽约大学教授,脸书公司首席人工智能科学家勒昆(Yann LeCun)和谷歌公司副总裁、多伦多大学名誉教授辛顿(Geoffrey Hinton), 以褒奖他们推动深度神经网络成为计算机技术的重要组成部分。三位科学家将平分 100 万美元的奖金。 图灵奖(ACM A.M. Turing Award),是计算机协会(ACM)于1966年设立的奖项,作为计算机领域最负盛名的奖项,有“计算机界诺贝尔奖”之称,专门奖励对计算机事业做出重要贡献的个人。其名称取自世界计算机科学先驱、英国科学家、曼彻斯特大学教授艾伦·图灵(Alan.M. Turing)。获奖者必须是在计算机领域具有持久而重大的先进性的技术贡献,大多数获奖者是计算机科学家。 人工智能目前是所有科学领域中发展最快的学科之一,也是当今社会最为热议的话题之一。这很大程度上归功于“深度学习”(deep learning)领域近年来取得显著进展。本吉奥、辛顿和勒昆这三位获奖者是“深度学习”领域的奠基人,他们把单层神经网络拓展成实用性多层神经网络,在图像识别、语音识别和机器翻译等领域,获得很好的效果。“深度学习”似乎已经成为人工智能的代名词,从ImageNet 图像识别,智能语音助手到自动驾驶,都得益于“深度学习”的发展。 所谓人工神经网络,是指参照人类神经结构和功能的特点,在计算机中模拟出一层或多层所谓“神经元”的计算单元,使它们之间通过加权方式相互连接和互相影响。改变这些连接点的加权值,则可以改变和扩展人工神经网络的计算性能。正是这三位科学家认识到和实践通过搭建多层神经元的方法,创建了较“深”的人工神经网络,这对于人工智能的发展具有突破性和创新性的意义,也为“深度学习”概念的出现奠定了重要的基础。 “深度学习”是机器学习的一个新的领域,目的在于建立模拟人脑进行分析学习的神经网络,模仿人脑的机制来解释数据,例如图像,声音和文本。“深度学习”是一种特征学习方法,把原始数据通过非线性的复杂模型转换为更高层次、更抽象表达的算法,可以将特征提取和分类结合到一起,用数据学习特征,也是一种可以自动学习特征的方法。 许多学者相信,“深度学习”技术将会逐渐发展愈加成熟,也将会进入比较平稳的发展过程。而更深一步的发展与突破需要对人工神经网络进行较大改进,也可能在包括脑科学在内的多学科交叉研究的基础上建立新的模型和方法。以此,通过极大提高计算机理解环境世界的能力,深度神经网络不仅在改变计算机模式,也在改变人类行为和科学世界的每一个领域。 就像其他创新工作一样,都不大可能是一帆风顺的,人工神经网络和“深度学习”从上个世纪80年代就开始使用模拟人脑的智能,帮助计算机完成模式识别任务。但是,当时并没有为计算机科学界认可。而辛顿、本吉奥和勒昆一直把这种思路坚持到现在。辛顿博士71岁,出生于伦敦,他在20世纪70年代初作为一名研究生时首次接受了神经网络这个想法,当时大多数人工智能研究人员都反对这个想法,就连他自己的博士导师也质疑这个选择。辛顿回忆往日光时说:“我和导师每周见一次面,有时会以争吵结束,有时候不会。” 勒昆58 岁,曾在辛顿的实验室中做过一年的博士后研究,之后加入当时顶尖的贝尔实验室。在贝尔实验室,勒昆应用“深度学习”研发出能识别手写信件和电话号码的系统,曾一度识别了美国 10% 的手写支票,获得很好的商业成功。而在其他领域的应用,勒昆则遇到了重重困难,只有当训练数据集足够大时,“深度学习”才能发挥作用,但当时很少有什么领域能满足这个条件,即使是现在,也不是每个领域都能满足这个条件。训练数据集小,即便算法在测试集表现很好,但在实际应用是也会出现极大误差,而当时的计算机性能和容量也无法满足拥有成千上万个参数的“深度学习”模型。使得人工智能的发展受到极大的限制。尽管相当长的时间里,勒昆的研究并不被看好,而他和当时也在贝尔实验室工作的现年55岁的本吉奥始终坚信“深度学习”的未来。 2004 年,在加拿大前沿科学机构的赞助下,辛顿创立了“神经计算和自适应感知”的专项研究项目,他邀请了在“深度学习”领域坚守多年的本吉奥和勒昆加入这个项目。从辛顿博士研究生期间开始的研究,到现在他们为深度学习已经默默奉献了 30 年。至此。深度学习”引领的人工智能开始获得了腾飞式的发展。有人把三位科学家的“深度学习”之旅称之为“孤独之旅”。我想这种孤独之旅的另一面就是坚定的信念,顽强的毅力和对科学无所畏惧全身心的追求。 William Schwartz 在1970年的“新英格兰医学杂志”中,曾经预测:到2000年,许多医生的脑力劳动,可以被人工智能中的“专家系统”替代,或者至少大大增强它在医疗领域中的作用。Schwartz也希望医学院的课程重新定向到医疗保健的社会和心理方面,医学院将主要吸引对行为和社会科学,以及生物信息科学感兴趣的申请人。换句话说,就是预测现代的大多数医疗技术方面的工作,将有人工智能所替代。但Schwartz的梦想在很大程度上,还没能实现。 迄今为止,生物医学领域中人工智能的成功使用,大都来自图像识别方法在放射学,病理学,皮肤病学和眼科学等学科的应用。尽管美国FDA最近批准了少数这样的系统,但目前许多这些项目都还仅限于在研究范围。 我本人感兴趣的领域是对人衰老过程和与对衰老影响因子的分析和预测,以及筛选具有强免疫原性和可以为HLA分子识别的肿瘤新生抗原的工作。这些都期待人工智能的深入发展提供重要的帮助。
个人分类: 健康|3565 次阅读|0 个评论
深度学习获得图灵奖说明了什么?
热度 1 lhj701 2019-3-30 10:58
深度学习获得图灵奖说明了什么 ? 2019年3月27日, ACM 正式宣布 将 2018 年图灵奖授予 Yoshua Bengio, Geoffrey Hinton 和Yann LeCun,表彰他们对于 深度学习神经网络的重大突破性贡献。 至此,深度学习神经网络,正式得到学术官方的认可,并相信 神经网络已经成为计算领域的重要组成部分。这 对深度学习未来寒冬的质疑画上了句号,去除了对出身“寒冬的”深度学习带来这次AI繁荣之后会再次带来AI寒冬的忧虑。 当然,深度学习也不是万能的,图灵奖对于深度学习的认可,也同时宣布,后深度学习时代的带来----它的出现将计算机如何对人类进行“算计”贡献,开拓了一个如何使用计算机的新领域,但同时它的局限也必然期待未来新的计算机使用模式的出现,当然未必是颠覆和替代,但必然需要开拓新的使用方式,只有那样,才可能以人工智能的骄傲再次登顶图灵的顶峰。 深度学习获得图灵大奖,说明了什么?一方面是大量工业信息业对于深度学习大量的实锤应用,是算法,更是大数据和大算力的胜利, 但更为重要的,也许是:人类终于决定,开始真正对机器(计算机器)放手了----过去的计算方式,人类将不确定性留给人类,而将确定后的不确定性交给机器处理。因此,人类对于规律的确定性,是总体可控和把握的。 而深度学习,真正将人类不能确定的不确定性交给机器--也就是说,创造一种机制,让机器去寻找那些确定性(规律),等机器找到了那些它认为的确定性规律后,再处理不能预先确定的任务。 从这个角度上讲,深度学习的方法,赋予了机器拥有自我寻找智能(规律)的权利。而人类的角色,开始从自己寻找确定性规律中部分解脱出来,转而创造能够自己寻找到这些确定规律的机器和机制,也就是开始真正创造可以代替人工的智能。 也许,这是目前,将人的智能嵌入到机器,能够寻找到的唯一实用办法,而显然,那些确定性规律,那些能够被机器确定的规律(而不是人),必定存在于海量的数据中(大数据), 这也是目前深度学习的缺陷: 它 是数据产生的机器智能,必须依赖于产生它的智能的数据 。理论上数据必须足够多,或者必须足够饱和规律的存在。但数据是万能的吗?或者说数据一定能够产生智能吗?或者说,一定存在能够让深度学习识别出规律的数据样本吗? 但不论如何,智能的机器是人类创造的智能工具,它们的产生是替代人类完成各种繁琐的工作任务的,显然没有万能的工具,但人类创造为人类服务的工具的步伐从来没有停止过。 深度学习作为一种嵌入到机器(计算机)的智能工具,也许不是完美的,但它是证明实用和有效的,可以完美的胜任人类的一些传统的工作任务。而它存在的不完美,也正是推动未来人类创造新的、能够自己识别社会和自然规律的智能机器,而未来他们的出现,正是能够登顶未来图灵大奖的新的自己认识不确定性规律的智能机器。 在后深度学习时代,他们会是什么呢?
个人分类: 人工智能|3594 次阅读|1 个评论
(机器的)深度学习不是(人类的)学习:人机双脑的较量不在此
geneculture 2019-2-25 17:38
(机器的)深度学习不是(人类的)经验学习:人机双脑的学习能力的较量不在于此。 (机器的)神经网络也非(人类的)神经网络:人机双脑的神经网络的较量更不在此。 尽管如此,但是,基于神经网络的深度学习的确又比基于统计的机器学习进了一大步。当然,更比基于规则的自动计算(批处理)进步了许多。 最近,在调查了信息处理、人工智能和大数据三类技术之后,我发现:2016年及其前后这段时间是非常重要的转折点。因此,就2016-2018年自己提出的“三信、三智和三数”之后,进一步坚定了自己长期研究方向,即:人际和人机以及机际乃至机人之间怎样结合得更好这个融智学的研究方向。因此,我对于(机器的)深度学习不是(人类的)经验学习和(机器的)神经网络也非(人类的)神经网络这样的判定是支持的。尽管如此但是我仍然认为:机器的神经网络虽非人类的神经网络,机器的深度学习也非人类的经验学习,但它们的确都有其不可替代的重要的里程碑意义。因为,它们向人类(尤其是人类的广大成员甚至少数精英成员都)提出了巨大的挑战。未来学的第一和第二定律在此更具备可验证性。-邹晓辉 附录: “深度学习不是学习”:英特尔高管与AI大牛LeCun展开互怼 量子位 02-24 13:09 郭一璞 夏乙 假装发自 旧金山 量子位 出品 | 公众号 QbitAI “深度学习不是真正的学习。” 英特尔神经形态计算实验室主任Mike Davies在国际固态电路会议(ISSCC)上将深度学习批判了一番。 Davies说,深度学习跟大多数人印象中的并不一样,它只是一种优化程序,实际上并不是真正在“学习”。 受到攻击的重灾区,还是深度学习中的反向传播算法。 他说,反向传播与大脑无关,而只是在深度学习计算机程序中用来优化人工神经元响应的一种数学技术。 自然的反向传播例子,并不存在。 虽然他承认深度学习现在非常有效,但他也坚定地强调里,大脑才是真正智能计算的范例。 Davies死死抓住不放的“不像大脑”这个问题,也正是深度学习教父Hinton一直重视的。 不过对于这次批判本身,美国媒体ZDNet认为,他主要的攻击目标其实是Yann LeCun。 深度学习vs.神经形态计算之争 为何攻击LeCun? 就在周一,这位AI大牛在同一个学术会议上发言时,顺便批判了Davies在搞的神经形态计算。 神经形态计算是英特尔布局的一个重要新兴方向,在这个领域,他们推出了芯片样品 Loihi 。英特尔说,这种芯片可以实现自主学习,而且能耗只有传统芯片的千分之一。 而Davies就是神经形态计算实验室的负责人,主管着英特尔在这一领域的探索。他参加ISSCC会议,也是来讲Loihi的。 Loihi用了一种名叫 尖峰神经元(spiking neurons) 的技术,这类神经元只有在输入样本后才能被激活。 神经形态计算倡导者们认为,这种方法更好地模拟了大脑的运行机制,比如说信号传递的过程就像大脑一样经济。 在LeCun看来,神经形态计算领域没有产生有实际效果的算法,为何要为一种没用的算法构建芯片? 不过Davies直接表达了反对,他说,神经形态计算产生的算法是有效的, LeCun忽视了神经形态计算的优势 。 Davies说:“LeCun反对尖峰神经元,但他却说我们需要解决硬件中的稀疏性,尖峰神经元就是干这个的啊。” 他说,这太讽刺了。 为了驳斥对尖峰神经元的批评,Davies引用了安大略滑铁卢一个名叫应用脑科学(Applied Brain Science)的机构的数据,比较了一种语音检测算法在不同芯片上的表现。 这个算法被要求识别“aloha”这个词,并且拒绝无意义词语,这家机构在CPU、GPU和Loihi芯片上运行了这一算法。 这份数据显示,Loihi在常规处理器上运行常规神经网络性能最佳,特别是在计算速度方面,并且能源效率更高,不过精确度会低一些。 在另一个例子中,Davies说Loihi执行的基本分类器任务的速度是传统的基于GPU的深度学习网络的40倍,准确度提高了8%。 因此,Davies认为Loihi效率高得多,可以运行规模越来越大的网络,他认为,机器人控制将会是Loihi这类神经形态芯片的杀手级应用。 Davies还从LeCun的批评挑出了他认同的一点:尖峰神经元的硬件非常充足,提供了很多工具来映射有趣的算法。 针对这句话后边隐含的“但是软件算法层面不行”,Davies说,他的团队当前目标就是在算法上取得进展,算法确实拖了这个领域的后腿。 在推特上,也有人隔空参与了这场辩论。 有人认为,神经形态计算就像量子计算一样处在起步阶段,所以没什么可批判的。 也有人觉得深度学习已经在许多领域内取得了成果,量子计算和神经形态计算还差得远,虽然技术很尤其,但两者都没有被证实,而且都没有编程模型。 其实,这场LeCun和Davies的争斗,除了学术方面之外,另外不得不考虑的一点就是Facebook和英特尔的商业竞争。 周一,LeCun表示Facebook内部正在开发AI芯片,一旦Facebook自己的芯片研发成功,那就不需要使用英特尔的芯片了,甚至还会抢走英特尔的客户。 看完这场隔空口水战的来龙去脉,我们把目光收回到Davies指责的核心:反向传播。 训练深度学习模型离不开它,但对它的质疑也接连不断。 反向传播到底行不行? 反向传播,生于1986,出自David Plaut、Steven Nowlan、Geoffrey Hinton在卡耐基梅隆大学(CMU)时发表的Nature论文:Experiments on Learning by Back Propagation。 △ www.cs.toronto.edu/~fritz/absps/bptr.pdf 31年后,这一概念已经随着深度学习广泛应用到了各种领域,也遇到了最大的一次危机。 它的的提出者之一、“深度学习之父”Hinton在多伦多举办的一场会议上公开提出了质疑。 他说,他对反向传播“深感怀疑”,甚至想“全部抛掉,重头再来”。因为,大脑的运作机制并不是这样的。 “不像大脑”这个问题,Hinton一直非常重视,他曾在MIT的一次讲座上说,他相信正是这些不像大脑的东西,导致人工神经网络的效果不够好。 在Hinton发出自我质疑之后,反向传播更成了讨论的热点,甚至被称为“今日AI的阿喀琉斯之踵”。 不过现在,可能Hinton应该自己的作品稍微满意一点了。 哈佛大学临床神经科学学院的两位科学家在最新一期Cell旗下期刊《认知科学趋势》(Trends in Cognitive Sciences)上发表综述,总结了人工神经网络的反向传播算法,在大脑中是怎样体现的。 这篇综述题为“大脑中误差反向传播的理论”(Theories of Error Back-Propagation in the Brain),综合了近来的一批理论研究,分析几类生物反向传播模型。 作者说,这些理论研究“否定了过去30年来普遍接受的教条,即:误差反向传播算法太复杂,大脑无法实现”。 根据这些研究,脑神经回路中类似反向传播的机制,是基于突触前和突触后神经元活动的简单突触可塑性规则。 论文:https://www.cell.com/trends/cognitive-sciences/fulltext/S1364-6613(19)30012-9 One more thing… 虽然Davies和LeCun在一场学术会议上隔空吵得很热闹,但深度学习和神经形态计算并非势不两立。 有不少学者在研究如何把神经形态芯片和深度学习结合起来。 比如: 美国橡树岭国家实验室、加州理工大学和田纳西大学的学者们,就曾经研究过如何在高性能计算设备、神经形态芯片和量子计算机上运行复杂的深度神经网络。这是他们的研究: A Study of Complex Deep Learning Networks on High Performance, Neuromorphic, and Quantum Computers arxiv.org/abs/1703.05364 而奥地利格拉茨技术大学的Guillaume Bellec、Franz Scherr等人,最近在arXiv上公开了一项研究,提出了反向传播的一种替代方案。他们的研究题为: Biologically inspired alternatives to backpropagation through time for learning in recurrent neural nets arxiv.org/abs/1901.09049 供感兴趣的朋友们深入探索~ — 完 — https://mbd.baidu.com/newspage/data/landingsuper?context=%7Bnid%3Anews_9369246177122558788%7Dn_type=0p_from=1
个人分类: 融智学前期探索|2362 次阅读|1 个评论
如何从零基础学最前沿的 Python 深度学习?
热度 7 wshuyi 2019-1-26 11:28
学深度学习,可能“弯道超车”吗? 困惑 深度学习的初学者,总会在学习路径上遇到困惑。 先是那群框架,就让你不知道该从哪儿着手。 一堆书籍,也让你犹豫如何选择。 即便你去咨询专业人士,他们也总会轻飘飘地告诉你一句“先学好数学”。 怎样算是学好? 对方会给你罗列出一堆大学数学课程名称。直到你彻底 放弃 学习的想法。 真要是按照他们的要求,按部就班去学,没有个几年功夫,你连数学和编程基础都打不完。 可到那时候,许多“低垂的果实”还在吗? 其实,Sylvain Gugger (数学专业出身,自学深度学习,一年时间成为 fast.ai 的研究科学家)说了一段真话(链接在 这里 )。 把我常用的那个例子,再给你举一遍。 如果你想 造汽车 ,恐怕要有多少年的理论功底,以及技术实践。 但如果你只是想 开汽车 ,却是很快就能学会。 当个司机,你需要去了解汽油发动机原理吗? 不需要。 因为你开的车,甚至有可能根本就用不上汽油发动机(电动车)。 深度学习,底层实际结构很复杂。 上图还只是模块示意图哦。 然而,作为应用者,你只需要一两行代码,就能实现上述神经网络。加上数据读取和模型训练,也不过十行左右的代码。 不信? 你可以参考我的《 如何用 Python 和 fast.ai 做图像深度迁移学习? 》 感谢科技的进步,深度学习的用户接口,越来越像 搭积木 。 只要你投入适当的学习成本,就总是能很快学会的。 这种成本,究竟要投入多少呢? 成本 Jeremy Howard 的答案,是 7 节课。 我在《 如何用 Python 和深度迁移学习做文本分类? 》一文中,给你介绍过他的研究论文“用于文本分类的通用语言模型微调(ULMFiT)”。 与其说他是研究人员,倒不如说他是个老师。 Jeremy 看到许多普通人,被深度学习的高门槛拦在外面,很不愉快。 于是他研发了基于 Pytorch 的 fast.ai 深度学习框架 。 这个框架的特点是:几条语句,就能做出 前沿水平 (state of the art)的深度学习模型。 依据该框架,他还做了系列 MOOC ,现在在深度学习领域非常知名。 我给你写这一篇文章,是因为早上看见,Jeremy 发了一条消息,大家期待已久的2019版本 Practical Deep Learning for Coders 课程 终于 上线了。 按照课程要求,每周上一节课,视频看下来,大约需要2个多小时。 外加每周10个小时左右的练习时间。 7周之后,你就算结课了。 学这课程,需要的基础是什么? 机器学习?不需要。 深度学习?更不需要。 编程经验?这个确实需要,大概一年左右。如果你用的编程语言,恰好是 Python ,那就最好了。学的是其他语言也不要紧。因为 Python 是可以很快掌握的,就如同我在《 学 Python ,能提升你的竞争力吗? 》一文中跟你说的那样。 对了,还有数学呢? 只需要高中数学(对应美国教学大纲,你懂的)知识,就够了。 教学过程中,对于高等数学,如果需要,视频里会即时补充。 以上是你需要花费的时间成本和前导条件。 经济成本呢? 课程的教学视频是 免费 的。 内容 这一版的 MOOC ,都包括哪些内容呢? 在 这个页面 , Jeremy 做了介绍。 课程主要包含以下模块: 机器视觉(例如动物识别) 图片分类 图片分割 图片关键点 自然语言处理(例如影片评论情感分析) 语言模型 文档分类 表格数据分析(例如销售预测) 类别数据 连续数据 协同过滤(例如影片推荐) 下面,用几张截图,给你展示一下能学到什么。 这是对卷积神经网络工作原理的解释。 这是图片分割的效果。 你能学会如何对模糊图片进行增强。 以及如何训练语言模型和下游分类任务。 课程涵盖的知识点,包括但不限于以下内容: 怎么样?足够有用,也足够前沿吧? 效果 你可能很关心,花了7周时间学完之后,效果会怎么样? Jeremy 自己表示,课程里面有些前沿内容,还没有在学术期刊上发表。 如果你是学术圈人士,看了这句话,应该微微一笑——吹吧!怎么可能?傻吗? 但这个 Jeremy ,以前真这么干过。 前面提的他那篇 ULMfit 语言模型论文,你应该还有印象吧? 注意,Jeremy 不是像很多学者那样,先 发表 了论文, 然后 才把内容在课程中讲授的。 虽然是在旧金山大学教书,但是 Jeremy Howard 对于写论文的兴趣无限趋近于0. 他在上课的过程中,对于最新的机器学习研究旁征博引,带着一群初学者,游走在学科的边缘上。 他 直接 在自己的课程中讲了 ULMfit 这种方法,鼓励学生去试。 他展示的语言模型迁移学习分类效果,许多已经超过目前最优水平。 他发现许多显而易见的东西,居然都没有人尝试过,更没有人发表过。 于是,授课之余,他经常跑到人家深度学习圈儿里面,扔一两个想法和实践效果进去,不过基本上没人搭理他。 原因很简单,学术界也是有 路径依赖 的。 让人家专家学者放着大路不走,试你这野路子? 好在,具有真有一位自然语言处理领域的活跃学者,来找他聊天儿。说对他提的这种新自然语言处理深度学习方法,很感兴趣。 他挺开心的,俩人就聊,越聊越投机。 然后,这个叫做 Sebastian Ruder 的人,就提出来“既然你这想法,学术圈别人没试过,咱们合写论文吧!” 想起来了吧?我在知识星球里,曾经为你介绍过这家伙,以及他那份著名的 NLP 前沿进展汇总。 面对 Sebastian 伸过来的橄榄枝,Jeremy 如何表态呢? 他立即回答: No! 我才不写那玩意儿! Sebastian Ruder 于是使尽浑身解数,附加了以下条件: 你不需要给论文里面写一个字。只提供想法和代码就可以; 我帮你把它完整转换成为学术论文格式,用严谨的方式加以讨论; 咱们第一时间把论文放到预印本平台,并投稿自然语言处理领域的高水平会议,以便让更多人能免费阅读,并因此获得收益。 Jeremy 终于同意 了。 这篇论文被 ACL 接收后,收获大量关注。 更有趣的是,当初无人问津的方法,人们真的严肃尝试后,获得的奖项一个接一个。 我在《 如何用 Python 和深度迁移学习做文本分类? 》一文中,给你讲到过,Czapla 等人,就利用这种方法,轻松赢得了波兰语信息检索比赛 PolEval'18 的第一名,他们的模型效果,领先第二名 35% 。 这时候,回过头来,再看 Jeremy 那句“课程里面有些前沿内容,还没有在学术期刊上发表”,你明白意味着什么了吧? 资源 笃定决心要学的话,我们来说说如何上这门免费 MOOC 吧。 如果你使用笔记本电脑,可以点击 这个链接 ,直接访问课程的视频。 有意思的是,这一版课程,包含了新的视频播放器。最大的特点是,你可以用内置内容搜索的功能,直接定位到感兴趣的段落。这样,找起内容和知识点来,方便多了吧? 如果你用移动设备学习,这个播放器可能无法正常使用。没关系,你可以访问 这个播放列表页面 ,直接看视频。 不仅如此,为了让你能够用上 GPU 来实践深度学习,课程还专门在配套网站上为你提供了详细的 分步教程 。 够贴心吧? 我个人比较推荐其中的 Google Colab 和 Google Cloud Platform。前者免费,后者虽然有开销(每小时需要 0.38 美元),但如果你是新用户,Google 会先送给你 300美金 ,1年内有效。足够你学完这门课了。 我专门写了个步骤详细的教程,教你如何用 Google Cloud Platform 跑 fast.ai 课程的练习,你可以访问 这个链接 查看。 多嘱咐一句,课程的 论坛 ,一定要经常查看。 上面各路高手经常就课程相关内容,有些甚至是非常前沿的技术进行切磋。你在一边观看,都可以获益良多。 如果你有问题,也不妨抛出来。论坛活跃度很高,“同学们”会很乐意帮助你的。 激励 不少人试图去了解 fast.ai 的商业模式,于是问 Jeremy 。 他直接告诉大家:我们的商业模式,是花 自己的钱 做事,帮人们学深度学习。连资助我们都不要。 顺便说一句,fast.ai 的 slogan 是这样的: 翻译过来就是,让神经网络变得不再酷。 在别人刻意制造信息与技术的鸿沟时,偏偏有人认为,人工智能应该能帮助更多人,而不是只让少数技术领先者和巨头获益。 说到这里,你可能会疑惑,这个 Jeremy Howard 怎么这么奇怪? 世人一直追逐的两件事,不就是名和利吗? 论文发表,就是 名 ,多少人每天想的,不就是论文、论文、论文吗? 人家都关心怎么知识变现,也就是 利 ,他为什么不拿资助,不赚钱,还搭上自己的钱来做这件事? 他这么兢兢业业,为了课程设计和 fast.ai 框架演进,真是做到了废寝忘食,殚精竭虑。 2018的 Cutting Edge Deep Learning for Coders 里,经常有这样的情况。晚上要上课, Jeremy 中午饭都没吃,一直在尝试最前沿的方法,以便能把最新的技能传授给学生。 看得出来,他很疲惫。但是课上他的笑容,是满足而真诚的。 为什么面对名利,Jeremy 如此拒绝呢? 给你半分钟,思考一下。 …… 以下是答案公布时间。 不要名利,是因为他 不缺 那些东西。 在 Wikipedia 上面,有好几个 Jeremy Howard 。其中咱们提到的这位,页面是这样的: 他最为人知的身份,是企业家。 再看看这段早年经历: 19岁,别人才刚开始上大学的年纪,Jeremy 已经在麦肯锡年入20万美元了。 再看这段,更为传奇: 一个管理咨询界的人物,跑去 Kaggle 参赛,结果因为成绩太好,一年后就成了 Kaggle 的主席和首席科学家。 至于名声,你看看 这段 2014年的 TED 演讲,就知道他到底有多知名。 详细介绍在 这里 。感兴趣的话,你可以自己去看看,励志一下。 我们总以为,要用足够的激励,让人们做出最大的产出贡献。 但是,许多最有影响力的 优质 产出,恰恰是那些根本对外部激励无感的人做出的。 这是不是值得制度设计领域的研究者,以及大型组织机构的管理者们思考一下呢? 关于英语 没错,课程是英文的。 别抱怨了。 没用。 你在抱怨的时候,那些花时间学英语的人,已经悄悄跑到你前面去了。 学吧。 我给自己的研究生,写过一篇英语学习方法介绍文章,叫做《 写给我即将入学的研究生(英语学习篇) 》。你要是感兴趣的话,不妨读读。希望对你学英语有帮助。 祝深度学习愉快! 喜欢请点赞。还可以微信关注和置顶我的公众号 “玉树芝兰”(nkwangshuyi) 。 如果你对 Python 与数据科学感兴趣,不妨阅读我的系列教程索引贴《 如何高效入门数据科学? 》,里面还有更多的有趣问题及解法。 如果你有疑问,欢迎进入 知识星球 上咱们的专属社区。
12469 次阅读|8 个评论
如何做到教学质量可持续的稳步提升?
geneculture 2018-12-30 09:40
在双字棋盘内,做教学大数据处理和基于统计的机器学习乃至基于神经网络的深度学习都是很好的一系列课题及项目选择。 这样可做到成千上万所学校教学质量稳步提升而且都是可持续的。 真正发挥了大数据和AI双重优势。 做到了智力劳动解放暨合理分配。 这即融智学与文化基因系统工程。
个人分类: 高等教育学|1474 次阅读|0 个评论
基于变分自编码器的单细胞转录组低维表示与可视化
jgu 2018-12-28 14:31
近年来,单细胞RNA测序技术(scRNA-seq)的迅速发展使得研究人员能够在单细胞层次上研究生物系统的转录异质性,这种信息通常难以通过传统的组学数据获得。然而,在单细胞层次上,转录组的随机波动会远远大于细胞群体的平均行为,另一方面,单个细胞的RNA总量极低,使得其准确测量极具挑战,因此目前的单细胞测序数据存在很大的噪声。其中,dropout现象是一种主要的噪声,即很多表达的mRNA没有被捕捉到,导致检测出来的表达量为0。有效的低维表示可以降低scRNA-seq数据中的噪声,从而使得我们能够更好的分析细胞类型与状态,并实现细胞分布的可视化展示。 本研究中,我们提出了一种基于深度变分自编码器的scRNA-seq数据分析方法——VASC,有效实现scRNA-seq数据的非监督降维与可视化。VASC对dropout现象进行了建模,并通过深度神经网络发现数据中复杂的非线性模式、降低数据噪声,从而做到可靠的数据降维与可视化。我们在超过20个数据集上(包含目前主流的scRNA-seq技术,例如SMART-Seq,inDrop,10X等)测试了VASC的低维表示性能,结果表明在大多数数据集中,VASC都能更好的提取细胞类型或者细胞分化过程的信息,体现了VASC广泛的适应性。 VASC代码可以从 https://github.com/wang-research/VASC/ 免费获得。 论文引用: Dongfang Wang, Jin Gu#. VASC: dimension reduction and visualization of single cell RNA sequencing data by deep variational autoencoder. Genomics, Proteomics Bioinformatics 2018, Accepted.
个人分类: 科研笔记|4886 次阅读|0 个评论
《抛石机攻城》:一个STEM项目 ——以深度学习的视角来浅析
热度 1 wangxianbang 2018-12-24 23:09
《抛石机攻城》:一个 STEM 项目 ——以深度学习的视角来浅析 王 鹏 引言:深度学习的基本特质有:一是深层动机;二是切身体验-高阶思维;三是深度理解-实践创新。本文利用文字、图片和视频等回顾了《抛石机攻城》项目的整个教学过程,尝试与深度学习的特征对接以期带来一些教学启示与实践反思。 关键词:深度学习;抛石机;教学启示;实践反思 \0 “ 趣味科技探究”兴趣选修课上,我给学生的项目任务是制作完成一个具有一定发射远度和精度的抛石机。目标是将子弹(螺母)发射出去,击倒对面桌子上代表不同分值的小兵偶。为获得高分,学生需要设计一定的瞄准装置,同时运用战术策略来出奇制胜。当然,由于存在一枚子弹连击的情况,让比赛充满了变数与惊险。 完成这个小工程的过程中,学生在科学(Science)、技术(Technology)、工程(Engineering)和数学(Mathematics)等方面都有所发展,教师的角色也在发生着变化。本文将回顾自己在小学阶段对此项目的实施过程,尽管教学实践并不完美,但希望能以深度学习的视角来浅析这一项目的教学过程,以期对读者有借鉴意义,为更多想进行综合实践性课程开发的老师带来参考。 教学过程: 这个活动来源于“兴华国际青少年科技运动会”中的一个竞技项目,要求选手利用一次性筷子、塑料小勺、螺母、钩码、棉线、小纸杯等材料以及尖嘴钳、剪刀、热熔胶枪和胶棒等工具来制作抛石机。原本对筷子的数量和装置的空间大小等有一定要求,但现在的小孩儿都是有想法的一代,虽然只是四年级和五年级的小学生。为了让他们能尽情施展想象力,满足其创作欲望,在开始制作活动后,我没有再提这些限制,给他们一次学习的自主权。 第一次课上,让学生观看了阿基米德保卫西西里岛时使用抛石机的卡通片(或者新版《杨家将》中的片断)后,我对这项活动进行了介绍,并让其观看了兴华科技运动会几届比赛中的精彩场面。 特别值得一提的是,广西师大附属外国语学校的周晓庆老师录制的情节跌宕起伏的《抛石机经典对决——东梧大战》,让学生们看得情绪高涨,个个摩拳擦掌,跃跃欲试。(后附视频链接) https://mp.weixin.qq.com/s?__biz=MzU0NDY2NjczOA%3D%3Didx=1mid=2247483655sn=247be6820e2ce71877a669dcb0e5d5ae 随后,我让学生对照着 PPT 中的几个样本进行组内讨论和设计。 他们就开始了头脑风暴,讨论起自己小组的设计。据家长的反馈,许多学生回到家中就开始了制作。看来,项目本身蕴含着魔力,能让学生内在的深层学习动机迸发出来! 图 1. 学生在家中设计与制作 第二次兴趣课上,就已经有小组带来了作品。下面是两件作品 图 2. 学生在课前的制作 左边的主创者是一位五年级的女生,右侧的主人是四年级的男生。对比来看,女生的作品在结构上更有对称性,底座上还画有线条,可见其规范细致。而男生的略显粗糙,能看出有些地方是边制作边改动,增加筷子的数量来换取稳定性的提高。他们试图以高度获利,但没有想到重物下落的甩动空间却减小了。尽管模仿视屏中的作品,增加了红光瞄准器,但可惜的是,不加思考地将其固定在了转动杆上。 各小组的组长领了材料与工具后,大家就热火朝天地行动起来。这之后,我就不再干涉他们的活动,而更多地像是一个服务者的角色。比如,给各个小组调配一下筷子、吸管、剪刀、尖嘴钳、尺子、钩码;监督他们安全地使用热熔胶枪;应他们的要求,将 PPT 翻到他们需要看的图片或视频;偶尔也会讲“可能会选拔表现好的同学参加兴华科技运动会”的比赛之类的话来激励一下,提升小组成员的参与度。因此,除了巡视和提醒安全事项之外,我的指导更多只是守在讲台上,看着学生安全地使用胶枪。看着学生们投入的样子,我感到自己好像是撒了一把种子到田野里,他们就各自竞相疯狂生长! 图 3. 学生加工 每个组的设计重点与作品质量显然是有差别的。有的设计想以高度取胜,但实际测试时子弹却高高越过对岸敌军阵地;有的稳固是靠底盘厚重,而有的则是在结构对称上面下功夫,却没考虑重物落下的空间;有的安装好了,准备试射时才发现勺子安反了…… 冠军作品 亚军作品 第三次课,在给了二十分钟的加工制作时间后,我安排一些已经初步完成作品的小组在教室里或走廊里进行轮流测试,要求至少2米的射程(约四块地板砖的距离)。 在学生测试出现问题时,我才开始适当地指导学生注意诸如结构的稳定性、转轴滑动的影响、重物的下降空间、配重与射程的关系、子弹出射角度、角速度与线速度的关系、子弹的弹道轨迹弧线与落点关系等问题,提醒他们要考虑作品的整体性结构设计,同时开始设计瞄准装置。 这次,我允许学生进行组间交流观摩,吸收别的小组好的方法。比如,第一小组用到的筷子数量少,但是稳固,因为结构对称,多处三角形结构的运用恰到好处;第五组高大,射程已经不是问题;第七组作品虽然不高大,但阻力臂(勺子端)长度大于动力臂(配重端),提高了发射时的速度(同轴转动,半径越大,线速度越大),依然射得远;第九组在结构的中间部位放置了一个胶带,似乎有瞄准器的意味…… 相互参观完,多数小组都重新进行了设计。 第四次课,各个组基本上都完成了作品。在二十分钟的最后一次集中加工之后,开始了第一轮选拔赛。 总共有九组,我进行了这样的安排: 1. 各个小组发射十发子弹,击中2米外(约四块地板砖的距离)的桌面上的小兵偶。以击中次数排名选出前六名。 2. 各组出一名裁判,进行交叉记录。(下面为裁判记录单) 参赛小组: 第 组 裁判员: 总成绩: 投射次数 1 2 3 4 5 6 7 8 9 10 发射次序 (击中则打对勾为记) 3 .如果不足六组,则余下的小组重新比赛,竞争入选名额。 第一轮选拔赛 第一轮选拔赛视频: https://v.qq.com/x/page/p08052130dv.html 果然不出所料,第一轮选拔后,只有三个组打中了小兵偶,从而直接晋级,其他均打空。余下六个组又进行了一次比赛,才又有一个小组晋级。 3. 进入下一轮比赛的小组,下节课将进行“对攻赛”,对手通过抽签产生。 而余下的小组,为了不打击学生的活动的积极性,也安排进行一次友谊性质的“对攻体验赛”。 第五次课,友谊体验赛与前四排名赛。为了能让晋级小组表现更好,我将友谊体验赛安排在前面。在被淘汰组进行比赛时,四强小组在走廊里进行模拟训练。一次课的时间只有60分钟,为节省时间,友谊赛只打一局(这些组战绩不佳,能打倒一个兵偶已属不易)。 这次的兵偶数量增加到三个:桌面倒扣水槽作为障碍物。一侧的大兵偶为一分,另一侧一个小兵偶为2分,在水槽后面只露出上半身的大兵偶也为2分。一颗子弹连续地击中兵偶算分,但水槽或桌面振动导致兵偶倒下则不算得分(这就为比赛带来了一定的悬念:选手需要打中的同时,也要考虑战术选则,反败为胜也是有可能)。每局的发射次数也增加到20次。 友谊赛结束,开始了前四名的排位赛。排名将决定决赛对手是谁。由于时间紧,只进行了一局。最后的结果是以打倒小兵偶的分值确定了前二名(下节课进行冠亚军决赛),后两名争夺第三名。 第六次课,三四名争夺与冠亚军之争。三四名由于双方选手及作品水平不太好,只进行了一局。更多时间还是留给了后面的压轴大赛。果然,这两个组没有让我们失望:三局打平后,只好以类似点球大战的方式决战——谁先打中小人谁胜出。所以,比赛的结果是没有失败者,学生们都很高兴! 冠亚军决赛视频: https://v.qq.com/x/page/b0800wfo2vc.html 第三名获奖 第三名分享经验——结构改进与发射效果 https://v.qq.com/x/page/s0817kxoruz.html 亚军获奖 亚军分享经验:比较腼腆的小组 https://v.qq.com/x/page/e0817tlwa4l.html 冠军获奖 冠军经验分享 https://v.qq.com/x/page/i08170s4vj0.html 讨论与反思: 从 STEM 方面讲,在这个教学活动以让学生利用筷子完成一个古代兵器——抛石机作为 工程 目标。前期学生进行了图纸的粗略设计(包括实践中的改进),实施过程中熟练使用了工具,灵活利用了材料的特性,这些是 技术 的核心(设计与操作)。重量(质量)、碰撞、能量、速度、重心、结构稳定性等,这些是 科学 概念(尽管学生尚处于经验层面,但他们能理解这些术语的含义)。底面积、半径、转动角度、抛物线、三角形稳定性等,都是 数学 工具性的体现。而在指导学生使用热熔胶时如何美观、整体结构要对称而非盲目堆砌等等,一定程度上也涉及到了 艺术 的美感培养。在项目实施过程中,我们并没有刻意去做出这样的划分,但其实这就是在真实任务完成(或问题解决)情境中的自然融合。 我们从深度学习的视角来审视这个项目教学活动。 我国学者李松林等将“深度学习”界定为“借助具有整合作用的实际问题激活深层动机,展开切身体验和高阶思维,促进深度理解和实践创新,进而对学习者产生深远影响的学习样态”。 他们认为,深度学习的内涵是指触及心灵深处的学习、是深入知识内核的学习、是展开问题解决的学习。而展开问题解决的学习有两种方式:课题研究式学习与项目创作式学习。(《抛石机攻城》项目显然属于后一种方式。) 深度学习的几个基本特质是:一是深层动机;二是切身体验-高阶思维;三是深度理解-实践创新。(李松林 贺慧 张燕 2018) 我们的教学活动属于项目创作式学习,可以依据深度学习的三个特质来对照分析一下。 学生的学习动机有没有被激活呢?从学生的课堂参与程度以及课后在家主动制作作品的行为来看,确实激发起了内心的欢喜。学生学习的动机类型是内在的,是源于对动手实践的自然渴望,而外部的激励只是教师给定的一个小目标。有效学习的前提就是学习者感兴趣,愿意参与进来。 学生是否有切身体验?是否进行了高阶思维? 显而易见,教学活动就是以学生为中心来展开的,特别是以动手实践与合作学习为主。教学活动体现了阶段性特点。首先,要保证开放性。不过多添加教师的指令,留出更多时间给学生自主活动,这是对学生自主性和创造力的尊重。其次,要体现生成性。把握好师生交流与教师集中指导的时机。先给学生一些经历(包括犯错的机会),问题的呈现与解决办法的提出才更显自然和真实。再者,教师的角色发生转换。在这个项目教学中,学生是中心,教师提供给学生创作所需要的心理安全环境,成为教学活动的组织者,学习进度的促进者、筹备各种资源的服务者……在这个项目教学活动中,教师不再是高高在上的权威,而仅是平等的首席参与者。 从结果上看,这项小工程带给这些小制作者们快乐,让他们学会了合作、专注,体验了从设计到作品的完整流程。 因此,学生的切身体验是充分的,在时间和空间上以及教师的管理上都得到了保证。 什么是高阶思维?所谓高阶思维,是指发生在较高认知水平层次上的心智活动或认知能力。新版的布鲁姆教育目标分类学的框架中将学习的认知过程维度分为六个层级:记忆/回忆、理解、应用、分析、评价、创造等。 后面三种认知方式属于高层次的心智活动,运用这样的方式进行的学习可以称之为高阶思维。 因为授课对象是小学生,我们在教学活动中并没有过分强调知识的记忆与理解。但肯定他们会 应用 已经有的经验来创作,如杠杆原理的应用、数学课上学习过的三角形的稳定性等; 分析 问题的难度与突破的办法,如小兵偶的距离不同,发射时拉下的勺子的角度不同、瞄准装置或参考物设计、子弹盒的设计;在分享环节可以看到他们是如何 评价 自己作品以及参考对手作品来改进;有些小组增加了瞄准装置、有些设计出了角度控制以及不断总结出自己的射击操作妙招,有些则在比赛过程中学会主动更改策略……这些都体现了学生的 创造性 。因此,问题解决始终牵引着学生发挥主动性,让思维处于高层次,不断进行着实践创新。 学生的学习有深度理解吗?他们的学习是否深入知识内核? 这个项目的核心知识块是“杠杆原理”。在苏教版小学科学的编排中,这一知识的教学是在五年级下册。兴趣班里的学生都是四、五年级的孩子,大多数还没有接触过这个概念。那是否就意味着要等到五年级学完杠杆原理再开展这个项目的呢?显然,这即是所谓的先学后教,教学思想的出发点是理论先于实践。然而,在依据课程标准而编写的不同版本的小学科学教材中,这一内容的编排位置是很不同的。广东省的一个版本就将其编写在了六年级上册。从这一点说明,杠杆原理的知识教学呈现与思维能力阶段性匹配并没有得到论证。另一方面讲,学生并不是脑袋空空来到教室,他们有过玩跷跷板的经历尽管这并不能对本次任务挑战带来多大帮助,但至少是教学的一个基点。因此,我们可以尝试“提前”教学。实践与理论并没有优先级之分,甚至可以说实践应当在理论之前才更符合人的认知心理过程。 同时,我们一直在反思“知识”的本源问题。知识的产生源于人类解决生产生活中的问题,知识及知识体系的建构也是在切身实践与理论总结中完成的。如果学生仅仅是学习书本上抽象化后的符号概念以及以缺少真实情境的习题演算来完成知识的获得,显然是无法深刻理解知识的内核并实现灵活应用,单调的教学形式也让知识的学习变得枯燥无味。 当我们的学生在把杠杆两端调整比例或者与别的小组作品比照时,他们可能发现效果的大不同;当他们把“子弹”射出时,也许明白了杠杆的实际用途;当他们为了精准打击“兵偶”而不断调节配重、发射角度或是研究“子弹”落地点与飞行弧线轨迹关系时……我们可以设想,在学生眼里杠杆已经不再只是一架装置,而是一套涉及多方面因素的工程体系。就是在这样的实践操作与不断反思调试中,学生可以体悟到力矩、半径与转动角度、发射点出射速度与射出角度的关系,也能理解能量的转换、结构稳定性与重心的关系等。这样建构的知识是生动的,更是源于实践的。(当然,我们也得承认在实际的教学中不能保证所有的学生都能学习到这些或全部理解到位。但我们应当相信,活动体验必然为学生将来学习那些定义完整的概念打下了情境基础。) 结语: 最后,尽管小学生的作品大多不美观,但就像爱因斯坦的小板凳,我们不可小觑其中所蕴藏的潜力。麦克斯韦曾说,实验的教育价值与仪器的复杂性成反比。融合式的 STEM 课程能带给学生制作这些“小板凳”的机会,更真实地促进学生发展。 因此,我们更应当关注的是这些作品背后的课程价值,教与学的过程让学生成长了什么。当然, 在本项目的教学中,很多方面还很不到位,比如原本想增设学生反思与相互评价的环节,但发觉学生的兴致已过,而且项目开展的时间过长,也就只能简单完结,期待下次活动设计中能把创作与反思穿插进行,使教学环节能更紧凑与合理。 如何具体设计,就需要我们在课程设计与教学实施中多去思考、提炼和实践创新! 李松林,贺慧 ,张燕.深度学习究竟是什么样的学习 .教育科学研究,2018,(10). Lorin W.Anderson 等编著,蒋小平,张琴美,罗晶晶等译,罗星凯审校. 《布卢姆教育目标分类学——分类学视野下的学与教及其测评(完整版)》【M】.北京:外语教学与研究出版社,2009. 李松林,贺慧 ,张燕. 深度学习究竟是什么样的学习 .教育科学研究,2018,(10). Lorin W.Anderson 等著,蒋小平,张琴美,罗晶晶等译,罗星凯审校 . 《布卢姆教育目标分类学——分类学视野下的学与教及其测评(完整版)》【 M 】 . 北京:外语教学与研究出版社 ,2009.
个人分类: 科技教育|9338 次阅读|3 个评论
[转载]深度学习及其在医学中的应用【摘要】
chinapubmed 2018-12-12 21:54
生物和医学技术的进展正在为我们提供大量生物和生理数据,例如医学图像,脑电图,基因组和蛋白质序列。从这些数据中学习促进了对人类健康和疾病的理解。深度学习是从人工神经网络中发展而来的,基于深度学习的算法在从复杂数据中提取特征和学习模式中大有前途。这篇论文的目的是提供深度学习技术及其在生物医学领域中一些最新应用的一个概述。我们首先介绍了人工神经网络和深度学习的发展。然后,我们描述了深度学习的两个主要组件,即:深度学习架构和模型优化。随后,展示了一些深度学习应用例子,包括医学图像分类,基因组序列分析以及蛋白质结构分类和预测。最后,我们提供了我们对深度学习领域未来方向的观点。 查看原文 医学图像分析,图像分割找肿瘤,器官,软骨,海马区等等,好像各大互联网公司都有相应的API了,估计不好用。脑电图,癫痫预测等等。 测序及表达分析,基因表达,特征序列(cis区,增强子,miRNA靶)预测,功能预测(变异,非编码)等等。 蛋白质结构预测:见最近的新闻。 例子太多了,自己看原文吧。里边有100多篇reference,难啃!
个人分类: 生物信息|1139 次阅读|0 个评论
如何用 Python 和循环神经网络预测严重交通拥堵?
热度 8 wshuyi 2018-12-12 12:09
本文为你介绍,如何从 Waze 交通事件开放数据中,利用序列模型找到规律,进行分类预测。以便相关部门可以未雨绸缪,提前有效干预可能发生的严重拥堵。 寻找 之前在《 文科生如何理解循环神经网络(RNN)? 》一文中,我为你讲解过循环神经网络的含义。《 如何用 Python 和循环神经网络做中文文本分类? 》一文,我又为你介绍了如何用循环神经网络对文本做分类。 我不希望给你一种错误的简单关联,即“循环神经网络 只能 用来处理文本数据”。 事实上,只要是序列数据,你都可以考虑一下循环神经网络。 我一直打算找个其他序列数据的样例,给你展示循环神经网络的更多应用场景。 但是这个数据不太好选择。 目前一个热门的应用场景,就是金融产品的价格预测。 每时每秒,金融产品的价格都在变动。把它汇集起来,是个典型的序列数据。 但是我一直不看好这种应用。因为金融产品的定价,应该是面向未来的。基于历史价格信息寻找波动规律,并对未来价格进行预测,实际上如同看着后视镜开车一般危险。 但是,还有很多人依然乐此不疲地尝试。很多时候,他们也能尝到成功的甜头。 这是为什么? 原因在于,金融市场的参与者,并非理性的机器,而是由人组成的群体。从行为金融学的角度来看,进化给人类思考与行为带来了一些“快捷方式”,你可以利用它们从中渔利。 陆蓉教授的《行为金融学》栏目,对此有详细介绍。 例如,人们追涨杀跌,认为历史会重演; 例如,吸引大众关注到事件,总会带来买入; 例如,人们会倾向于投资于自己熟悉的标的; 例如,人们会购买下跌的已持仓标的,来摊薄成本。 …… 如果没有大风浪,这种对市场参与者行为规律的洞察,确实可以帮你赚钱。你可以从价格的历史波动中,挖掘出这些规律的影响。但是这对 没有模型可用 的人来说,不公平。教你建模,就如同教你考试作弊。 如果遇到黑天鹅事件,其影响大概率会 超过 市场参与者行为偏误带来的历史价格波动规律。那么你,可能会因为应用模型,而遭遇 亏损 。你大约不会认为这是自己的错误,而直接把我当做骗子,朝我扔鸡蛋。 理性权衡后,我决定 不用 金融产品价格趋势分析,作为循环神经网络的应用样例。 其他开放的序列数据,当然也有很多。例如共享单车租用数据、气温变化数据等。 不过这些应用,一来别人都写过了,不新鲜。二来,气温变化,你看天气预报就好了。共享单车租用数量……你真的关心这里的规律吗? 正在我犹豫的时候,一次偶然的机会,我接触到了一个新的序列数据样例——交通事件数据。我觉得,把它作为应用案例分享给你,可能更合适一些。 比赛 拿到这个数据,是因为我参与了一次编程马拉松(hackathon)比赛。 比赛在 Frisco 的 UNT Inspire Park 举办。从早上8点开始,一直到晚上9点多才结束。中间可以自由吃免费提供的点心和水果,也可以到院子里晒晒太阳放放风。大家还可以自由交流和组队。 主办方为参赛者提供了若干种开放数据,也提了一些问题供大家参考解答。当然,实际参赛的时候,你也可以自己拟定新的题目。 这其中,就包括了 Waze 数据。 我在中国开车,平时用的都是高德导航,对于 Waze 这款 App 不大熟悉。 简而言之,这个 Waze 应用除了提供一般的导航功能之外,还有一个类似于众包的功能——让司机们自由提交路况信息。 这样一来,Waze 就利用群体智慧形成了一个眼观六路耳听八方的巨大网络,随时依据用户提供的情况,汇总成实时交通参考。并且汇报给用户,以便于大家调整自己的行车路线。 我觉得最有用的特点是,在堵车的时候,你可以了解到前面究竟发生了什么。其他导航也有实时交通状况提示,但是你对前面的情况一无所知。道路半幅施工?交通事故? 信息的对称,可以在很大程度上,让司机避免焦虑。 Waze 从几年前开始,就和政府部门合作,进行数据开放共享。这样一来,政府可以通过 Waze 的数据了解交通实时状况,对于问题进行快速的响应处理;与此同时, Waze 用户也因为可以获取整合其他相关类型的政府开放数据(例如道路规划等),更加有效合理安排出行。 这次比赛,主办方提供的数据,是 DFW (达拉斯-沃斯堡都会区)区域,11月1日到29日的 Waze 交通事件(Incidents)开放数据,这是政府开放数据的一部分。这些数据基本都是来自于 Waze 用户的提交。 原始的数据,接近 300 MB。每一条事件信息,都包含了提交的经纬度,以及时间。因此在探索性数据分析阶段,我做了几个可视化图形。 这是我当天跟新认识的编程高手 Jesse 学的 QGIS 分析结果。 看看图上的点,每一个都对应一次事件汇报。这叫一个密密麻麻啊。 因为 QGIS 初学,用得不熟,我还是用 Python 进行了分类绘图。 这只是前 3000 条数据中部分类型的可视化。其中红色代表交通拥堵,黄色代表事故发生,蓝色代表有车停在了路肩上。 可以看到,红色的数据量最大。这说明交通拥堵是个大问题。 我把全部的数据都拿了出来,提炼出包含的事件类型,包括以下这些类: 我看到,其中单是交通阻塞,也是分为若干级别的。其中最严重的,分别是“大型交通拥堵”(large traffic jam)和“超大型交通拥堵”(huge traffic jam)。 于是,我把所有这两种严重交通拥堵事件,合并成一个集合;其他剩余事件,作为另一个集合。 对于每一个严重拥堵事件,我追溯30分钟,把之前同一条道路上,发生的事件,按照顺序存成一个列表。这样的列表,有987个;但是,其中有一些,是骤然发生的,30分钟的区间里面,没有任何其他事件作为先兆。这样的空列表,我进行了清除。剩下了861个有效序列。 同样,从剩余事件集合中,我们随机找到了861个非空有效序列。这些序列,后续紧随事件,都 不是 严重拥堵。 我们对严重拥堵之前30分钟的事件序列,标记为1;对于 非 严重拥堵之前30分钟的事件序列,标记为0。 于是,我们就把问题转换成了,能否利用事件序列,进行分类,预测后续是否会发生严重拥堵。 靠着这个模型,我们团队(UNT IIA lab代表队,昵称 watch-dumpling )在这次比赛中,获得第一名。 这是 HackNTX 官网的报道( http://t.cn/EUbS9m5 ) 。 UNT 网站也正式发布了 这则新闻 ( http://t.cn/EUbS127 ),于是我周围尽人皆知。我才刚拿到手的奖金,立即就因为请客被扫荡一空了。 夺冠纯属是个意外,幸运占得比重很大。但是我觉得我们做的这个模型,还是有些应用价值的。 下面,我就以这组 Waze 交通事件数据,详细给你讲解一下,如何用 Python, Keras 和循环神经网络,来实现这个序列数据分类模型。 环境 要运行深度学习,你需要有 GPU 或者 TPU 的支持,否则会累坏你的笔记本电脑的。Google Colab 是个不错的实验平台,可以让你免费使用 TPU 来进行深度学习训练。你可以阅读《 如何免费云端运行Python深度学习框架? 》一文,查询更为详细的介绍。 这里,请你使用 Chrome 浏览器,点击 这个链接 ,安装一个插件 Colaboratory 。 把它添加到 Google Chrome 之后,你会在浏览器的扩展工具栏里面,看见下图中间的图标: 然后,请到本范例的 github repo 主页面 。 打开其中的 demo.ipynb 文件。 点击 Colaboratory 扩展图标。Google Chrome 会自动帮你开启 Google Colab,并且装载这个 ipynb 文件。 点击上图中红色标出的“复制到云端硬盘”按钮。Google 会为你新建一个 属于你自己的 副本。 点击菜单栏里面的“代码执行程序”,选择“更改运行时类型”。 在出现的对话框中,确认选项如下图所示。 点击“保存”即可。 下面,你就可以依次执行每一个代码段落了。 注意第一次执行的时候,可能会有警告提示。 出现上面这个警告的时候,点击“仍然运行”就可以继续了。 如果再次出现警告提示,反勾选“在运行前充值所有代码执行程序”选项,再次点击“仍然运行”即可。 环境准备好了,下面我们来一步步运行代码。 代码 首先,我们读入 Pandas 软件包,以便进行结构化数据的处理。 import pandas as pd 这次还要读入的一个软件包,是 Python 中间进行数据存取的利器,叫做 pickle 。 import pickle 它可以把 Python 数据,甚至是许多组数据,一起存储到指定文件。然后读出的时候,可以完全恢复原先数据的格式。这一点上,它比用 csv 进行数据存储和交换的效果更好,效率也更高。 下面我们从本文配套的 github 项目中,把数据传递过来。 !gitclonehttps://github.com/wshuyi/demo_traffic_jam_prediction.git 数据的下载,很快就可以完成。 Cloninginto 'demo_traffic_jam_prediction' ... remote:Enumeratingobjects:6, done . =pickle.load(f) 先看其中的事件词典 event_dict : event_dict 以下就是全部的事件类型。 {1: 'roadclosedduetoconstruction' , 2: 'trafficjam' , 3: 'stoppedcarontheshoulder' , 4: 'roadclosed' , 5: 'other' , 6: 'objectonroadway' , 7: 'majorevent' , 8: 'pothole' , 9: 'trafficheavierthannormal' , 10: 'roadconstruction' , 11: 'fog' , 12: 'accident' , 13: 'slowdown' , 14: 'stoppedcar' , 15: 'smalltrafficjam' , 16: 'stoppedtraffic' , 17: 'heavytraffic' , 18: 'minoraccident' , 19: 'mediumtrafficjam' , 20: 'malfunctioningtrafficlight' , 21: 'missingsignontheshoulder' , 22: 'animalontheshoulder' , 23: 'animalstruck' , 24: 'largetrafficjam' , 25: 'hazardontheshoulder' , 26: 'hazardonroad' , 27: 'iceonroadway' , 28: 'weatherhazard' , 29: 'flooding' , 30: 'roadclosedduetohazard' , 31: 'hail' , 32: 'hugetrafficjam' } 同样,我们来看看存储事件序列的数据框。 先看前10个: df.head( 10 ) 注意,每一行,都包含了标记。 再看结尾部分: df.tail( 10 ) 读取无误。 下面我们来看看,最长的一个序列,编号是多少。 这里,我们利用的是 Pandas 的一个函数,叫做 idxmax() ,它可以帮助我们,把最大值对应的索引编号,传递回来。 max_len_event_id=df.events.apply(len).idxmax() max_len_event_id 结果为: 105 我们来看看,这个编号对应的事件序列,是什么样子的: max_len_event=df.iloc max_len_event.events 下面是长长的反馈结果: 读一遍,你就会发现,在超级拥堵发生之前,确实还是有一些先兆的。当然,这是由人来阅读后,获得的观感。我们下面需要做的,是让机器自动把握这些列表的特征,并且做出区别分类。 我们看看,这个最长列表的长度。 maxlen=len(max_len_event.events) maxlen 结果为: 84 这里的前导事件,还真是不少啊。 下面我们要做的,是把事件转换成数字编号,这样后面更容易处理。 我们使用以下的一个小技巧,把原先的事件词典倒置,即变“序号:事件名称”,为“事件名称:序号”。这样,以事件名称查询起来,效率会高很多。 reversed_dict={} for k,v in event_dict.items(): reversed_dict =k 我们看看倒置的结果词典: reversed_dict 这是反馈结果: { 'accident' :12, 'animalontheshoulder' :22, 'animalstruck' :23, 'flooding' :29, 'fog' :11, 'hail' :31, 'hazardonroad' :26, 'hazardontheshoulder' :25, 'heavytraffic' :17, 'hugetrafficjam' :32, 'iceonroadway' :27, 'largetrafficjam' :24, 'majorevent' :7, 'malfunctioningtrafficlight' :20, 'mediumtrafficjam' :19, 'minoraccident' :18, 'missingsignontheshoulder' :21, 'objectonroadway' :6, 'other' :5, 'pothole' :8, 'roadclosed' :4, 'roadclosedduetoconstruction' :1, 'roadclosedduetohazard' :30, 'roadconstruction' :10, 'slowdown' :13, 'smalltrafficjam' :15, 'stoppedcar' :14, 'stoppedcarontheshoulder' :3, 'stoppedtraffic' :16, 'trafficheavierthannormal' :9, 'trafficjam' :2, 'weatherhazard' :28} 成功了。 下面我们编写一个函数,输入一个事件列表,返回对应的事件编号列表。 def map_event_list_to_idxs (event_list) : list_idxs= list_idxs.append(idx) return list_idxs 然后,我们在刚才是找到的最长列表上,实验一下: map_event_list_to_idxs(max_len_event.events) 结果是这样的: 看来功能实现上,没问题。 读入 numpy 和 Keras 的一些工具。 import numpy as np from keras.utils import to_categorical from keras.preprocessing.sequence import pad_sequences 系统自动提示我们,Keras 使用了 Tensorflow 作为后端框架。 Using TensorFlowbackend. 我们需要弄清楚,一共有多少种事件类型。 len(event_dict) 结果是: 32 因此,我们需要对32种不同的事件类型,进行转换和处理。 我们把整个数据集里面的事件类型,都变成事件编号。 df.events.apply(map_event_list_to_idxs) 结果如下: 0 2 3 4 5 6 7 8 9 10 12 13 14 15 16 19 20 21 22 23 24 25 26 27 28 29 ... 831 832 833 834 835 836 837 838 840 841 842 844 845 846 847 848 850 851 852 853 854 855 857 858 859 860 下面是结果: , , , , ] 注意,第一行,明显比后几行都要长。 对于输入序列,我们希望它的长度都是一样的。因此,下面我们就用最长的序列长度作为标准,用 0 来填充其他短序列。 data=pad_sequences(sequences,maxlen=maxlen) data 这是结果: array( , , , ... , , , ],dtype=int32) 注意,所有的0,都补充到了序列的最前端。序列都一样长了。 下面,我们把全部的分类标记,存储到 labels 变量里面。 labels=np.array(df.label) 后面,我们有好几个函数,需要用到随机变量。 为了咱们运行结果的一致性。我这里指定随机种子数值。你第一次尝试运行的时候,不要动它。但是后面自己动手操作的时候,可以任意修改它。 np.random.seed( 12 ) 好了,下面我们“洗牌”。打乱数据的顺序,但是注意序列和对应标记之间,要保持一致性。 indices=np.arange(data.shape ) np.random.shuffle(indices) data=data labels=labels 然后,我们取 80% 的数据,作为训练;另外 20% 的数据,作为验证。 training_samples=int(len(indices)* .8 ) validation_samples=len(indices)-training_samples 我们正式划分训练集和验证集。 X_train=data y_train=labels X_valid=data y_valid=labels 看看训练集的内容。 X_train 结果为: array( , , , ... , , , ],dtype=int32) 注意由于我们补充了“0”,作为填充,因此原先的32种事件类型的基础上,又加了一种。 这就是我们新的事件类型数量: num_events=len(event_dict)+ 1 我们使用嵌入层,把事件标号,转换成一系列数字组成的向量。这样,可以避免模型把事件序号,当成数值型数据来处理。 这里,我们指定每一个标号,转换成 20 个数字组成的向量。 embedding_dim= 20 利用事件类型数量,和事件向量长度,我们随机构造初始的嵌入矩阵。 embedding_matrix=np.random.rand(num_events,embedding_dim) 下面我们搭建一个循环神经网络模型。其中的 LSTM 层,包含了32位输出数字。 from keras.models import Sequential from keras.layers import Embedding,Flatten,Dense,LSTM units= 32 model=Sequential() model.add(Embedding(num_events,embedding_dim)) model.add(LSTM(units)) model.add(Dense( 1 ,activation= 'sigmoid' )) 这里,我假设你已经看过了《 如何用 Python 和循环神经网络做中文文本分类? 》一文,所以就不对细节进行讲述了。如果你没有看过,或者已经遗忘,可以点击 这个链接 复习一下。 如果你对 Keras 的使用方法还不熟悉,我再次向你推荐 François Chollet 的《Deep Learning with Python》。 下面,是处理其中的嵌入层参数。我们直接把刚才随机生成的嵌入矩阵挪进来。而且,不让模型在训练中对嵌入层参数进行修改。 model.layers .set_weights( ) model.layers .trainable= False 下面,我们开始训练。并且把模型运行结果保存起来。 model.compile(optimizer= 'rmsprop' , loss= 'binary_crossentropy' , metrics= ) history=model.fit(X_train,y_train, epochs= 50 , batch_size= 32 , validation_data=(X_valid,y_valid)) model.save( mymodel_embedding_untrainable.h5 ) 可以看到,因为有 TPU 的强力支持,程序在欢快地运行中。 训练过程结束之后,我们利用 matplotlib 绘图功能,看一下训练中,准确率和损失值的变化。 import matplotlib.pyplot as plt acc=history.history val_acc=history.history loss=history.history val_loss=history.history epochs=range( 1 ,len(acc)+ 1 ) plt.plot(epochs,acc, 'bo' ,label= 'Trainingacc' ) plt.plot(epochs,val_acc, 'b' ,label= 'Validationacc' ) plt.title( 'Trainingandvalidationaccuracy' ) plt.legend() plt.figure() plt.plot(epochs,loss, 'bo' ,label= 'Trainingloss' ) plt.plot(epochs,val_loss, 'b' ,label= 'Validationloss' ) plt.title( 'Trainingandvalidationloss' ) plt.legend() plt.show() 这是准确率变化曲线。 可以看到,效果还是不错的。因为我们数据中,不同标记各占一半。因此如果构建一个 dummy model 作为标准线的话,对所有的输入都猜测0或者1,准确率应该只有50%。 这里的准确率,已经达到了65%-75%之间,证明我们的模型是有意义的。只不过,抖动比较厉害,稳定性差。 这是损失值变化曲线。 这个图看起来,就不是很美妙了。因为虽然训练集上面的损失值一路下降,但是验证集上,这个效果并不是很明显,一直剧烈波动。 看到结果,不是最重要的。关键是我们得分析出目前遇到问题,原因是什么。 注意我们前面使用了嵌入矩阵。它随机生成,却又没有真正进行训练调整,这可能是个问题。 因此,我们这里再次构建和跑一下模型。唯一改动的地方,在于让嵌入矩阵的参数也可以随着训练进行自动调整。 from keras.models import Sequential from keras.layers import Embedding,Flatten,Dense,LSTM units= 32 model=Sequential() model.add(Embedding(num_events,embedding_dim)) model.add(LSTM(units)) model.add(Dense( 1 ,activation= 'sigmoid' )) 注意这里的差别,就是 trainable 设置为真值。 model.layers .set_weights( ) model.layers .trainable= True 构建模型,再次运行。 model.compile(optimizer= 'rmsprop' , loss= 'binary_crossentropy' , metrics= ) history=model.fit(X_train,y_train, epochs= 50 , batch_size= 32 , validation_data=(X_valid,y_valid)) model.save( mymodel_embedding_trainable.h5 ) 绘图看看。 import matplotlib.pyplot as plt acc=history.history val_acc=history.history loss=history.history val_loss=history.history epochs=range( 1 ,len(acc)+ 1 ) plt.plot(epochs,acc, 'bo' ,label= 'Trainingacc' ) plt.plot(epochs,val_acc, 'b' ,label= 'Validationacc' ) plt.title( 'Trainingandvalidationaccuracy' ) plt.legend() plt.figure() plt.plot(epochs,loss, 'bo' ,label= 'Trainingloss' ) plt.plot(epochs,val_loss, 'b' ,label= 'Validationloss' ) plt.title( 'Trainingandvalidationloss' ) plt.legend() plt.show() 这次的准确率曲线,看起来好多了。验证集波动没有这么剧烈,模型稳定性好了许多。而且,准确率的取值,也获得了提升。后半程稳定在了75%以上。这样的模型,就有应用价值了。 但是我们看看损失值曲线,可能就不这么乐观了。 注意从半程之后,训练集和验证集的损失值变化,就发生了分叉。 这是典型的过拟合(over-fitting)。 发生过拟合,主要原因就是相对于复杂的模型,训练数据不够用。 这时候,要么增加训练数据,要么降低模型复杂度。 立即增加数据,不太现实。因为我们手中,目前只有那29天里积攒的数据。 但是降低模型复杂度,是可以利用 Dropout 来尝试完成的。 Dropout 的实现机理,是在 训练 的时候,每次随机把一定比例的模型中神经元对应权重参数,设置为0,让它不起作用。这样,模型的复杂度,就会降低。 下面,我们轻微修改一下,在 LSTM 层上,加入 dropout=0.2, recurrent_dropout=0.2 这两个参数。 from keras.models import Sequential from keras.layers import Embedding,Flatten,Dense,LSTM units= 32 model=Sequential() model.add(Embedding(num_events,embedding_dim)) model.add(LSTM(units,dropout= 0.2 ,recurrent_dropout= 0.2 )) model.add(Dense( 1 ,activation= 'sigmoid' )) 依然保持嵌入层可以被训练。 model.layers .set_weights( ) model.layers .trainable= True 再次运行。 model.compile(optimizer= 'rmsprop' , loss= 'binary_crossentropy' , metrics= ) history=model.fit(X_train,y_train, epochs= 50 , batch_size= 32 , validation_data=(X_valid,y_valid)) model.save( mymodel_embedding_trainable_with_dropout.h5 ) 绘制图形的函数跟之前两次完全一致。 import matplotlib.pyplot as plt acc=history.history val_acc=history.history loss=history.history val_loss=history.history epochs=range( 1 ,len(acc)+ 1 ) plt.plot(epochs,acc, 'bo' ,label= 'Trainingacc' ) plt.plot(epochs,val_acc, 'b' ,label= 'Validationacc' ) plt.title( 'Trainingandvalidationaccuracy' ) plt.legend() plt.figure() plt.plot(epochs,loss, 'bo' ,label= 'Trainingloss' ) plt.plot(epochs,val_loss, 'b' ,label= 'Validationloss' ) plt.title( 'Trainingandvalidationloss' ) plt.legend() plt.show() 这次的准确率曲线,看起来达到的数值,跟没有加入 Dropout 的差不多。 然而,我们可以感受到训练集和验证集达到的准确率更加贴近。曲线更加平滑。 下面我们看看损失值曲线的变化。 这个曲线上,过拟合的去除效果就更为明显了。可以看到训练集和验证集两条曲线的波动基本保持了一致。这样我们更可以确信,模型预测能力是稳定的,对外界新的输入信息,适应性更好。 如果把咱们的模型放在交通管理部门那里,可以期望它根据 Waze 获得的新序列数据,能以大约 75% 的准确率,预测严重交通拥堵的发生。这样,交管部门就可以未雨绸缪,提前做出干预了。 用序列模型,欺负金融市场的散户,属于零和博弈。然而这种在交通管理上的应用,大概更能造福社会,体现科技的价值吧。 小结 通过本文的学习和实际上手操作,希望你已了解了以下知识点: 不只是文本,其他序列数据,也可以利用循环神经网络来进行分类预测。 对定类数据(categorical data)进行嵌入表示,如果用随机数初始,那么在建模过程中把嵌入层一起训练,效果会更好。 数据量不够的情况下,深度学习很可能会发生过拟合。使用 Dropout ,可以降低过拟合的影响,让模型具有更好的稳定性和可扩展性。 希望这篇文章,可以帮助你了解循环神经网络的更多应用场景。在实际的工作和学习中,灵活运用它来处理序列数据的分类等任务。 祝(深度)学习愉快! 喜欢请点赞和打赏。还可以微信关注和置顶我的公众号 “玉树芝兰”(nkwangshuyi) 。 如果你对 Python 与数据科学感兴趣,不妨阅读我的系列教程索引贴《 如何高效入门数据科学? 》,里面还有更多的有趣问题及解法。
10350 次阅读|20 个评论
蛋白质结构预测最新进展和DeepMind
热度 1 xjb 2018-12-8 10:39
CASP 是两年一度的蛋白质结构预测评比,主要用来衡量这个既困难又重要的领域的进展。 CASP 是完全 blind 的评比,也就是说参赛者在进行预测的时候真实的蛋白质结构可能还没有用实验技术解出来。 CASP 比赛有很多类别,最流行的是接触图( contact map )预测和三维结构预测。接触图预测是三维结构预测的关键一步,可以用来直接衡量所使用的人工智能技术的好坏。每一类别又有两种参赛者:人工组和服务器组。这两种参赛者都依赖于计算机软件,没有谁会真正去手工预测的。他们的区别在于: 1 )对每一个测试蛋白质,服务器有三天时间而人工组有三个礼拜; 2 )人工组可以看到和使用所有服务器组的结果,而服务器组是看不到其他组的结果的。因为这样,最好的人工组总是要好于最好的服务器组的。 DeepMind 在 CASP13 中取得了骄人的成绩,他们的新闻宣传提高我们这个领域在公众里面的知名度,但在某些地方也误导了公众。比如 有些报道宣传人工智能战胜人类; 误导公众以为他们使用的人工智能技术是完全原创的, 以为只有他们在这个领域取得进展,其他参赛者不堪一击; 误导公众以为这个问题已经被他们解决了。 DeepMind 参赛的类别是三维结构预测人工组,宣传战胜人类既不符合实际也毫无意义。 DeepMind 没有参加接触图预测,所以无法直接衡量他们的人工智能技术到底有多好。他们团队口头告诉我的是他们的精度跟我的服务器 RaptorX-Contact 差不多。 在三维结构预测人工组中,如果按总成绩排名, DeepMind 大概是第三名。 DeepMind 最擅长的是用来预测比较难的蛋白质,在这一类确实是最好的。在 32 个最难的测试蛋白质上, DeepMind 和第二名人工组的第一模型的平均 TM 得分分别是 0.5836 和 0.5208 (满分是 1 分)。这个结果并不能表明其他参赛者不堪一击,特别是考虑到 DeepMind 团队一共有 17 个训练有素的人员(有些不是全职做这个项目的,他们方法摘要上写了 10 个人的名字),远超其他团队的力量。那么是不是只有 DeepMind 取得进展呢?情况完全不是这样的。由于 CASP13 的测试蛋白质的难度与 CASP12 相当,我们可以通过比较这两次的预测精度来估计这个领域的进展。 在接触图预测中,所有排名靠前的组都取得远超 CASP12 的成绩,比如两次正式排名第一的 RaptorX-Contact 在 CASP12 和 CASP13 的得分 (L/5 远程精度 ) 分别是 47% 和 70% 。在三维结构预测中,两家最好的服务器 RaptorX-Contact (RaptorX-DeepModeller) 和 Zhang-Server (Quark) 在难的蛋白质上远远好于 CASP12 最好的人工组。基本上来说,大部分参赛者都取得了比 CASP12 好的成绩。这说明这个领域取得了非常大的进展,那么进展的真实原因是什么呢?肯定不是 DeepMind, 因为他们的方法到现在还没发表呢,大家在比赛前不可能知道他们的方法。其实看看 CASP13 参赛者提交的方法摘要就清楚了。基本上所有成绩好的组都使用了一个叫做全局性的深度卷积残差神经网络( Deep Convolutional Residual Neural Network )的方法去预测接触图或者距离图。而我刚好是第一个提出这个方法的,第一篇描述这个方法的论文《 Accurate De Novo Prediction of Protein Contact Map by Ultra-Deep Learning Model 》我于 2016 年 9 月份就贴在网上了, 2017 年 1 月 5 号正式发表于国际计算生物学协会的官方杂志《 PLoS Computational Biology 》,并于 2018 年获得了《 PLoS Computational Biology 》的突破 / 创新奖。这篇论文用了大量的结果(包括第三方 CAMEO 严格的测试结果)表明深度卷积残差神经网络可以极大提高蛋白质结构预测的性能。我于 2017 年在细胞子刊《 Cell Systems 》上发表了另外一篇论文指出这个方法也可以用来预测膜蛋白的结构。膜蛋白对制药很重要,但是用实验技术解膜蛋白的结构很困难,所以针对膜蛋白的预测技术尤其重要。 那么 DeepMind 在难的蛋白质上表现为什么是最好的呢? DeepMind 当然也实现了深度卷积残差神经网络,并且使用了更多层数和训练数据。但是不知道他们的神经网络到底比我的 RaptorX-Contact 改进了多少。另外,他们比我多做了一步,他们把深度卷积残差神经网络预测出来的信息输入到当前一个最强大的蛋白质建模软件 Rosetta 里面去构建三维结构。而我因为人太少(去年基本上是一个人在做)还没来得及使用 Rosetta 。 Rosetta 并不是 DeepMind 开发的,它是 David Baker 教授历经 20 多年开发出来的一个软件。 Rosetta 可以把一个差不多的三维结构优化得非常好。可以看出, DeepMind 真正赢的原因并不是方法上有很大的创新,主要在于工程上的整合,他们把每一个关键步骤都调试和优化地非常好。而大学或者研究所的团队一般是没有这么多人进行这方面的工作 , 今后要跟 DeepMind 竞争光靠一个小的研究组在工程上的优化是很困难的,一定要有一个新的非常好的想法。 这个领域在最近几年取得了比较大的进展主要在于两个方法: 1 )基于共进化的预测蛋白质接触图的全局分析方法。这个方法 1999 年在网上非正式发表,但是直到大概 10 年前才被重新注意到; 2 )基于深度卷积神经网络的蛋白质接触图或者距离图的全局预测方法。第一个方法对于真正难的蛋白质效果不好,一般只能作为第二个方法的输入。没有第一个方法作为输入,第二个方法也能做得不错。 DeepMind 的成绩进一步证实了这两个方法特别是后者的有效性。尽管进展很大,但是大部分预测结果的精度离实验技术还有点远,所以做实验的不用担心失业,刚买不久的电镜也不用担心浪费了。
7307 次阅读|1 个评论
爱犯错的智能体(十七):灵光一闪与认知错觉
热度 3 heruspex 2018-11-20 07:35
公元前 245 年,古希腊叙拉古城的赫农王命令工匠制作一顶纯金的王冠。工匠完工后,国王感觉不放心,对着重量没变的王冠左看看,右看看,总怀疑工匠把里面的金子换成其他材料了。可是,没证据又不好明说。跟大臣们说起此事,他们也只能面面相觑。于是,国王按一大臣的建议,请来了当时最有名的数学家阿基米德帮助鉴定。阿基米德看了半天,也没弄明白要怎么测。又冥思苦想了多日,还是没看出一丝端倪,便想泡个澡舒缓下心情。跨进装满水的浴盆后,他发现水的涨落似乎和他的站起坐下有关,而且坐下时还能感受到水向上对身体的托力,身体也随之变轻了。他恍然大悟,原来可以用测量固体在水中排水量的办法,来检测物体的体积。那也就能根据王冠的密度与体积之间的关系,来推测王冠是否造假了。 一瞬间他豁然开朗,跳出了澡盆,连衣服都忘记 穿 了,一路大声喊着 ” 尤里卡!尤里卡” (Eureka ,希腊语: εύρηκα ,意思是我知道了 ) 。阿基米德由此破解了王冠称重的难题,发现了工匠欺骗了国王。更重要的是,他因此发现了浮力定律,即物体在液体中得到的浮力,等于物体排出液体的重量。 图:阿基米德与浮力定律 科学发现靠什么呢?有不少重大的发现靠的是灵光一闪,如阿基米德洗澡时想到的浮力定律或阿基米德定律,俄国化学家门捷列夫玩扑克牌时发现的元素周期表。这种感觉可以用宋朝夏元鼎《绝句》中的“踏破铁鞋无觅处,得来全不费工夫”来形容。我国管灵光一闪叫“顿悟”,西方则把它称之为 Eureka effect( 尤里卡效应,或称为 Aha Moment 和 Eureka Moment) 。 与人皆有之的、来自潜意识自然反映的直觉不同,顿悟虽然也是潜意识的反映,但相对神秘。目前在学术界,关于顿悟的发生仍然争论不休。一是其在脑区发生的精确位置未知,一是在何种环境下能发生也未知。所以,阿基米德只好泡澡来启发思考,而量子电动力学的创始人之一费恩曼则爱在泡酒吧的同时顺便做研究。 从文献的总结来看,顿悟这种思维方式包括两个部分:首先是在某一问题上已经经过进行了长时间的思考,但陷入了困境。尽管尝试了能想到的各种可能性,仍不得其门而入。突然某一天在某地,令人意想不到的就有了灵感,并快速找到了问题的答案。而且,该灵感不必要依赖于原来已经僵化的解题逻辑或结构,甚至需要“跳出三界外”,才有可能获得。 一般认为,它有四个特点: 1 )它是突然出现的; 2 )对该问题的求解是流畅、平滑的; 3 )通常有正面效应; 4 )经历顿悟的人相信它的解是真实和正确的。这四个特点往往需要组合在一起才能见效,如果分开了就很难获得灵感或顿悟 。 尽管关于灵感仍无合理的解释,但可以推测它的形成机制不是突然凭空在大脑中加速形成的,应该与人类已经学习好的某些结构具有关联性。那么,它和我们哪种思维方式比较相似呢?如果能找到其中的关联,也许我们就能设计具有类似创造能力的人工智能体。 我们不妨了解下人类认知中普遍采用的两种思维方式:快思维和慢思维,以及快思维中存在的直觉统计错觉 。 一、认知错觉 人类经历了长时间的演化,发明了语言、制造了工具、 建立了几尽完备的数学理论体系,并通过其他智能体不可能具备的、长时间的学习来帮助提高知识水平。然而, 很多高阶能力并不见得会在日常生活中起主导作用。比如,我们虽然会在大学学习微积分,但绝大多数情况下,我们只需要知道用电子表格填下数字就行了。甚至在需要缜密计算时,有时候人类还是会凭自己的经验或直觉来优先进行判断。 举个极端情况的例子, 为什么在股市中专家的建议经常不怎么管用呢?实际上,多数专家在做分析时,都是按《经济学原理》来指导和建议的,目的是对投资组合进行利益最大化。总不能说经过了千锤百炼的经济学原理有严重不足吧,可为什么股民很多还是很容易被割韭菜呢?因为实际上偏好理性决策或慢思维的人并不多,尤其在股市瞬息万变的时候,能做深层次思考、计算的机会也少,股民往往会凭自己的直觉或快思维来做快速决策。可是,这些决策很多时候是远离了专家建议的最优决策。 美国普林斯顿大学的心理学教授卡纳曼和其前同事特沃斯基对人的两种思维方式进行了深入研究。他们从 直觉统计学 (Intuitive Statistics) 的角度出发,发现了一系列有趣的现象,于 1974 年在 Science 发表了一篇社会科学领域引用最高的关于不确定性判断的论文 ,后进一步形成了 展望理论 (Prospect Theory ,也有称前景理论 ) ,并因为这些成果卡纳曼于 2002 年获得诺贝尔经济学奖 ( 注:特沃斯基过早去世,因而没能获奖 ) 。尽管获得的是经济学奖,但其理论体系详细地是阐述了智能体在认知上存在的认识误区。 他们发现人在做很多复杂任务判断时,并不会用缜密的思维去计算每个事件的概率,反而会借助于少量的启发式技巧来做更为简单、快速的判断。这些判断策略在绝大多数情况下是有效的,不然人很快就会在自然进化中被淘汰。但是,这种判断策略有时会导致严重和系统性的错误,而人类却不见得会意识到,即使是受过训练的专家也是如此。 比如我们在判定物理量如距离和大小的,常通过启发式的规则来做主观的概率评估。看得越清楚的物品通常会被认为距离更近,反之更远。虽然这种规则在一定情况下是有效的,但也可能会带来系统性误差。如在“立霾”后,就很容易把距离估得远一些,以致于有可能需要依赖听觉来辅助识路。而类似的系统性偏差在概率意义的直观、启发式判断中广泛存在着。 根据卡纳曼和特沃斯基的理论,人类在快思维中,会有三种评估概率的启发式策略: 1 ) 代表性 (representativeness) ,常用于“当人被询问要判断一个目标或事件 A 属于类别或过程 B 的概率”的情形。 2 )实例或场景的 可用性 (Availability) ,常用于“当人被询问要评估一个类的频率或者一个特定发展的可能性”时。 3) 从锚点的调整 (Adjustment from an anchor) ,常用于“当一个相关值可用时的数值预测”。这三种启发式策略高度的经济,一般也有效,但它们容易产生 系统偏差 和 预测偏差 。具体来说: 1 )代表性 (representativeness) : 当测试者被给予不同的概率比例暗示时,比如做问卷调查时,告诉测试者,某人是图书馆员的概率是 60% ,农夫为 40% 。在无其它信息时,测试者会使用这些概率来判定一个人的职业;但在缺乏概率信息时,如果引入某段毫无价值但却有代表性的描述时,比如告知平时常见的图书馆员的衣着打扮,测试者就很容易被这个暗示影响,导致不正确的结论。这是由于人对于 结果的先验概率的不敏感性 形成的。 另外,由于人们对事件发生的可能性进行评估时往往依赖于直觉,因此很少考虑事件的样本数量影响。如小样本情况下产生的波动性要明显大于大样本。但人直觉上却很容易认为两者的波动性是一致的。这是人对于 样本规模存在不敏感性 引起的。 对于机会,人类也存在误解,常以为远离随机性的事件不是太可信。事实上局部有规律的行为并不会否定全局随机性,但它却会误导人们形成不合逻辑的推理。这种误解被称为 赌徒谬误 (gambler’s fallacy) ,它让人们以为一系列事件的结果会隐含某种自相关的关系。比如 A 事件的结果影响了 B 事件,就推测 B 是依赖于 A 的。比如最近天气转晴,连续几天大太阳就会让人高概率担心周末会下大雨。而赌徒则认为如果一直手气不好时,则会以为再过几把就能翻盘回本甚至赚钱。 不仅如此,在做预测时,人类更多会偏好用自己选择的材料做判断,而非真正需要预测的结果,即 对可预测性不敏感 。比如在招聘时面试官容易受面试表现影响,即使面试者的材料准备得更充实可信,但面试官还是会过分相信自己的判断, 形成验证性错觉 (Illusory of Validity) 。而这种错觉最终会被 均值回归 (Regression toward the mean) 检验并现形。其原因在于,人的表现容易受运气成份影响,导致某个时刻的发挥异常精彩或失常。但时间一长,就会回到正常的表现上去。这也能解释为什么现在上海和一些地方的中考要考察初二开始的月考和期中期末成绩,本质上是为了避免“一锤子买卖”引起的验证性错觉。 2 )可用性 (Availability) : 我们评估事件的概率或某类别发生的频率时,会根据曾经经历过或知道的事情和例子来联想。比如我们会根据在新闻中报道的飞机失事,来判断飞机失事率的高低,而较少考虑飞机与其他交通工具的实际失事比例。又比如,我们会根据周边的同龄人或熟人有心脏病出意外的情况,来评估自己可能得心脏病的风险。这种判断的启发式称为 可用性 。然而,可用性往往受频率或概率以外的因素影响,如搜索集的有效性、可想象性 (imaginability) 、错觉相关性 (illusory correlation) 和示例的可遍历性 (retrievability) ,导致产生 预测偏差 。 关于 搜索集有效性 ,卡纳曼和特沃斯基曾做过一个实验。他们询问测试者英文字母 r 或 k 在第 1 个字母还是第 3 个字母出现的次数更多。多数人回答是前者,因为直觉上更容易想到第 1 个字母为 r 或 k 开始的单词,而要想到第 3 个出现的单词时,则需要费点脑筋。而实际上作为辅音, r 或 k 会更多出现在第 3 个字母上 。 在 可想象性 方面 , 如果评估示例不在记忆中的类别的概率,此时人则需要按某个规则来估计。这种情况下,人会生成多个示例,然后评估其可能性。比如,我们在做商业计划时,会想象可能碰到的各种风险以评估其失败的概率。由于想象的信息并非真实情况,所以会引起偏差。 人也在产生 错觉相关性, 如对两件共同发生的事情。卡纳曼和特沃斯基曾让几个假装的精神病人画画,然后让测试者根据诊断结果判断他们是否有偏执狂或疑心病,以及判断画的画有没有独特的视角。从测试者判断结果来看,测试者大概率会形成有相关性的判断,如认为疑心病与独特视角之间存在相关性。这称为 错觉相关性 。其原因是因为之前形成的成对相关性的印象,会导致了随后产生预测偏差。 3 )调整和锚定效应 (Anchoring Effect) : 当我们在做决策时,会将某些特定的数值或状态作为起始点,而后的调整会因为此起始点而受限,从而影响到最终的决策方案。其原因在于我们给了最初的信息或起始点,比如给予那些明显的、难忘的证据过多的权重和重视,就容易产生歪曲的认识。比如我们常说的第一印象就是一种锚定效应。《唐逸史》中所说的唐明皇时期,钟馗为终南山人(镇宅赐福圣君)因为相貌丑陋应举不中,羞愧之下触殿阶而死。这是为第一印象所累。正面的锚定效应也有,比如光环效应,一个帅哥和自信的讲者,总能让人听报告时觉得物超所值,当然也更容易被报告忽悠。这还是为第一印象形成的锚定效应所累。 为了证实锚定效应, 1974 年卡纳曼和特沃斯基曾做了一个有名的实验。他们要求测试者估计非洲国家在联合国的席位百分比。首先,测试者需要旋转一个有 0-100 数字的罗盘,根据停下来的数字做初始决定。测试者将被告知所选择的数字比实际值大或小,然后测试者可以向上或向下调整估计值。结果,他们发现这些随机选择的数字对最终结果有明显影响。初始值为 10 和 65 的两个小组,最终调整的平均值为 25 和 45 。由此可见,初始状态设定后,确实会引起锚定效应,限制人解决问题的范围。 因此,深入理解这些启发式规则,有助于改进在不确定情形时人的决策和判断能力。也需要注意,这些不足并不是否定我们人类的直觉能力。正如大部分时间我们都是健康的,但偶尔也会生病。 直觉也是如此,并非一直都是对的。即使统计学家也不见得会是一个好的直觉统计学家。近年的研究表明,除了这些启发式规则外,技能也有助于形成直觉判断和选择,如专家更依赖于其长期的训练获得的经验,而会相对少的依赖启发式规则。有的时候,技能和启发式规则会交替产生影响,促进人们形成快思维方式 。 尽管在很多情况下,直觉都是由个人的偏好如喜欢不喜欢、而不是精细的思考或推理来驱动。但当直觉思维得不到解决方案时,人类会自然转向一种更缜密、需要点努力的慢思维方式,或称之为理性思维阶段。此时,通过漫长学习期获得的知识才会更多地派上用场。 总之,在实际生活中,人类更习惯于快思维,只在困难问题才考虑慢思维,两者经常在无缝地交替使用着,但很少会思考其中的差异和潜在的风险。 二、认知错觉与顿悟 既然人类智能体普遍具有快和慢两种思维方式,人类还有独特的顿悟能力。而且顿悟的最终迸发似乎又是一种接近快思维的方式。那么,我们现有的人工智能模型有没可能复制这些机制呢? 如果只考虑预测性能,人工智能模型的“慢”的思维方式在某些领域确实已经占了上风。 2017 年以来各大人工智能顶会上的论文投稿数量巨增,人脸识别、图像检索领域的识别率已优于人类的能力,这些都可以佐证人工智能在利用复杂模型进行预测的方面有了明显的突破。但是,“快”的思维方式这块则还有明显的差距。 其原因一是缺乏人类学习的可塑性。结果,人工智能模型只能沿着固化的模型结构来完成指定任务。二是缺乏对“不同结构、不同模态的网络之间的联系”的学习。三是未考虑认知错觉或直觉统计学的可借鉴性。 如果以现有的深度学习模型作比拟,也许可以将认知错觉当成一种浅层思维方式。即在深度模型被充分训练和拟合后,在做快速判断时,并不一定需要经过深层次的结构来实现判断。而是像现在深度模型一样,在训练好的浅层区有一个直接联到输出端的跳连接 (skip connect) 。换个角度来说,如果假定人类构建的模型具有由粗到细的结构,当大脑中枢认为在比如 80% 的识别率也能保证其正常生存时,就会直接从相对粗糙的浅层位置跳连接到最终的结论输出端,以促进快思维的形成。 另外,要实现顿悟式的学习,也许可以考虑利用不同结构间的相似性。比如 AlphaGo 下围棋时,就不是完全依赖常规的规则判断,而是创新性地借助了图像处理和计算机视觉的办法来帮助分析围棋棋局的胜负。这从某种意义来看,这是一种 跨模态的结构学习 。那么,一个自然的问题是,这种结构迥然不同、却面向相同任务的模型之间有没有可能通过自动学习来获得呢?如果可能,也许人工智能体实现顿悟就有希望了。 当然,我们也不能忽视梦可能对顿悟形成的作用。数学家 Henri Poincare 庞加莱曾说过“作为一种无意识的思考方式,它却能帮助形成突破困境的结果。” 除了顿悟和认知错觉,智能体还有什么感觉也可能以浅层思维或快思维模式为主呢? 参考文献: 1. https://en.wikipedia.org/wiki/Eureka_effect 2. Kahneman, Daniel. Thinking, Fast and Slow. Farrar, Straus and Giroux, 2011 3 . Amos Tversky, Daniel Kahneman. Judgment under Uncertainty: Heuristics and Biases. Science, 185(4157):1124-1131, 1974. 4 . Daniel Kahneman; Amos Tversky. Prospect Theory: An Analysis of Decision under Risk Econometrica, Vol. 47, No. 2. (Mar., 1979), pp. 263-292 张军平 2018 年 11 月 20 日 延伸阅读: 19. 爱犯错的智能体 (十六):庄周梦蝶与梦境学习 18. 爱犯错的智能体 --- 语言篇:可塑与多义 17. 爱犯错的智能体 – 体感篇:我思故我在? 16. 爱犯错的智能体 --- 听觉篇(二):视听错觉与无限音阶的拓扑 15. 爱犯错的智能体 -- 听觉篇(一):听觉错觉与语音、歌唱的智能分析 14. 爱犯错的智能体 – 视觉篇(十一):主观时间与运动错觉 13. 爱犯错的智能体 -- 视觉篇(十):自举的视觉与心智 12. 爱犯错的智能体 -- 视觉篇(九): 抽象的颜色 11. 爱犯错的智能体--视觉篇(八):由粗到细、大范围优先的视觉 10. 爱犯错的智能体 -- 视觉篇(七):眼中的黎曼流形 9. 爱犯错的智能体--视觉篇(六):外国的月亮比较圆? 8、 爱犯错的智能体 - 视觉篇(五):火星人脸的阴影 7、 爱犯错的智能体 - 视觉篇(四):看得见的斑点狗 6、 爱犯错的智能体 - 视觉篇 (三):看不见的萨摩耶 5、 爱犯错的智能体 - 视觉篇 (二):颠倒的视界 4、 爱犯错的智能体 - 视觉篇(一): 视觉倒像 3、 AI版“双手互搏”有多牛? 浅谈对抗性神经网络 2、 童话(同化)世界的人工智能 1、 深度学习,你就是那位116岁的长寿老奶奶! � 张军平,复旦大学计算机科学技术学院,教授、博士生导师,中国自动化学会混合智能专委会副主任。主要研究方向包括人工智能、机器学习、图像处理、生物认证及智能交通。至今发表论文近100篇,其中IEEE Transactions系列18篇,包括IEEE TPAMI, TNNLS, ToC, TITS, TAC等。学术谷歌引用2800余次,ESI高被引一篇,H指数27.
9358 次阅读|7 个评论
目标检测网络学习研究笔记(RCNN-SPPnet-Fast/Faster RCNN)
mhaoyang 2018-11-17 19:10
一 、RCNN:Rich feature hierarchies for accurate object detection and semantic segmentation Tech report (v5) Ross Girshick Jeff Donahue Trevor Darrell Jitendra Malik 2014 原理: 训练一个CNN分类网络,固定输入图像尺寸,将最后一层FC的输出作特征向量送给SVM分类器,训练1001个分类器,多的那个为背景。 识别时采用selective search(选择性搜索)方法每张图像上得到2000多个目标候选框,然后将候选框对应的物体缩放成CNN输入图像大小,分别送到CNN以及SVM分类器,找到概率最大的候选框,然后采用非极大值抑制去掉重复的框,再使用线性回归输出目标准确位置(从selective search 得到的proposal变换为接近groundtruth的box)。 训练SVM时,采用hard negative mining方法,将IOU界于0.1-0.3之间的随机选取都作为背景,IOU大于0.5的做正例,具体CNN训练和SVM优化见论文,有很多技巧性的操作。 一张图像需要13s GPU 本方法mAP 53.7% PASCAL VOC2010 HOG based DPM 33.4% 本方法31.4% OverFeat 24.3% ILSVRC2013 二、SPPnet:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun 2015 原理: 本文主要解决了输入CNN图像必须为固定尺寸的问题。 采用一个多分辨率的池化层,将特征图归一化为固定尺寸的输出,再接FC分类层。 具体做法,最后一层Conv输出例如为14x14x256,即14x14分辨率,256通道。 将这个特征图,平均划分为1x1,2x2, 3x3, 6x6大小(以2x2为例,每一块得到7x7大小的特征图,共4块),再分别对每一块施加Max pooling 从而得到1x1,2x2, 3x3, 6x6 一共50个向量,每个向量都对应256维(因为输入为256通道),因此最后得到50*256维向量,为固定尺寸。 输入图像大小变化,则划分SPP时,步长对应改变即可,在数据集上分类准确度比一般的CNN高1-2% 在进行目标检测时,原图输入SPP网络得到特征图,使用Selective search得到候选框,并将每个候选框映射到特征图上,再对每个对应区域的特征图数据使用SPP 归一化,送给SVM分类,得到概率最大的那个region,采用非极大值抑制得到准确位置,再使用回归方法调整selective search的region输出准确位置。具体训练细节,样本选择见原文。 其中为了更好的处理不同大小的目标,使得特征图尺寸最合适。本文是将输入图像进行不同尺度缩放,使候选框大小接近224x224,然后再进行后续处理。因此本文需要在几个不同尺度上进行CNN特征提取。 mAP 59.2% Pascal VOC 2007 三、 Fast RCNN Ross Girshick 2015 原理: 核心思想与SPP没有本质差异,不过在SPPnet基础上进行了若干架构合并。 例如最后输出候选区域类别时,连同候选区域回归region一起输出(分类与位置回归进行了整合),SVM分类器舍弃不用,直接使用与FC layer良好对接的softmax分类器;训练过程相对SPPnet也更加简化,只需要一次训练(SPP需要训练CNN网络,训练SVM分类器,训练region回归网络),输入图像包含类别、位置信息,网络同时计算分类与位置回归部分。 正向推理时:输入图像得到特征图,用selective search得到2000多个候选框,然后在对应特征图区域上进行分类和位置信息的输出。与SPP不同的是,Fast RCNN没有对原图进行多个scale缩放,而是使用一种固定尺寸做输入,通过在训练样本加入大量不同尺度的缩放的目标使网络可以识别不同大小的物体。 另外,FastRCNN对最后的FC层进行了SVD分解,降低计算量,大大降低了遍历2000多个proposal的时间(0.4s降到0.1s),推理速度明显提升。 mAP 66% PASCAL VOC2010 四、 Faster RCNN Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun 2016 原理: 在Fast RCNN基础上,提出了RPN网络,将目标候选区域的生成性能进行了大幅度提升,后续处理同Fast RCNN。 RPN Region Proposal Network区域提案网络,工作时,在特征图上进行逐点搜索,每个点进行9个尺度的候选位置匹配,每个位置输出cls与reg信息,遍历结束后,通过对数万region的cls信息排序,选出cls最大的N笔数据,经过reg微调后成为正式proposal,送给Fast RCNN进行分类识别…… 五、 四种网络综合分析: 经过比较RCNN,SPPnet,Fast RCNN, Faster RCNN的原理和创新,不难看出,这些网络都是继承并发展了前一种网络而来。 RCNN在这些里面是最原始,通过Selective search算法得到2000多候选区域,然后逐个区域进行CNN分类网络的识别,CNN输出可能性最高的为真实目标。RCNN的贡献在于利用了selective search而不是暴力枚举所有的区域(以200x200图像为例,包含4万个搜索位置,每个位置如果使用9个尺度搜索(参考RPN),则有36万个proposal),虽然预测一张200分辨率左右的图像就需要13s GPU时间,但是如果是暴力枚举的话,则需要39分钟GPU时间。 另外RCNN在训练SVM分类器时处理背景的方法(hard negative mining,以及挑选positive 和negtive的技巧和经验)值得借鉴,目前仍有很高实用价值。 综上所述,RCNN主要是融合了Selective search算法提升搜索水平,以及研究发现了CNN 卷积层特征可以代替传统HOG、SIFT等特征,并采用SVM分类器,结合hard negative mining等技巧对目标识别做了一次提升,做出这个成绩主要还是取决于2年前CNN分类能力的巨大进步。 SPPnet分析了RCNN速度慢的原因是由于密集使用conv层做特征提取导致大量重复计算,于是开动脑筋,从SPM(Spatial Pyramid Matching)思想中借鉴了化整为零的思路,将一个目标特征进行多尺度组合,并实现归一化,解决了输入图像尺度和比例无法保持原样的问题;此举不仅提升了特征提取的准确性,而且创造性的将region区域的筛选从image段转移到了feature map端,尽管后续也需要做大量的遍历和筛选,但是conv特征提取仅需要一次,解决了RCNN重复计算的问题,把正向推理时间降到了0.38s,是一个巨大的进步。 另外,SPPnet为了最大程度保持不同尺度的特征,在输入端将原图缩放5个不同尺度,根据selective search生成的proposal大小不同,相应选择对应的尺度做处理,提高了检测的准确性从RCNN 53% mAP(PASCAL VOC2010)提升到59%mAP( Pascal VOC 2007) Fast RCNN在SPPnet基础上,没有提出太多新思想,主要是进行架构整合,把分类,位置回归进行了整合,使网络训练上工作量减少很多,系统架构更工整。同时把输入图像多尺度变换的做法抛弃了,采用暴力学习的方法在样本里添加目标的不同尺度图像,使网络识别具有尺度不变性。另外,在FC层采用了SVD奇异值分解算法,将FC计算量降低30%,很大程度上改进了多proposal的FC计算密集问题。 以上三种算法都是基于selective search算法从原图得到目标候选区域,此算法准确性很高,但计算量大,并且因为逻辑复杂,只能在CPU端完成,无法放到GPU。selective search在一张500x500的图像上,需要大约1-2s时间,已经大大超过了识别的时间,因此这个环节成为了目标检测的主要瓶颈。 Faster RCNN针对这个痛点,做了一个大创新,把生成region proposal的工作使用CNN网络来实现,其实RPN网络的提出也并非石破天惊的创举,而是通过分析featuremap每个点对应原图的reception field,找到了一个合适的遍历的尺度,本质上说,这种思想是selectve search的退化,退化成了原始的暴力搜索(枚举);只不过feature map毕竟大小有限,另外这个工作可以由GPU矩阵运算实现,所以速度还是超级快的,生成region proposal 只需要3ms(ZF网络5层卷积,feature map是原图的1/16,在宽与高两个方面),并且RPN生成的几千proposal里面都带有类别概率,可以排除掉大量的非目标物体,因此在后续识别的工作上也减少了无效计算。 对于featuremap上暴力搜索所有点的方法,其实可以改进。例如通过分析只搜索可疑的点,这样对于减少RPN计算量是有帮助的,同时这样一来,对于训练样本的制作也可进一步简化,不过鉴于现在速度已经很快,而且有cls的评价指标做筛选,做如此改进可能也只能提升一点点,没有太大实际意义。 以上为学习笔记和研究心得,欢迎各位同道中人提出不同意见探讨、学习。 未经许可,禁止转载
3322 次阅读|0 个评论
文科生如何理解循环神经网络(RNN)?
wshuyi 2018-11-15 21:05
这一份视频教程中,我会用简明的例子和手绘图,为你讲解循环神经网络(Recurrent Neural Network, RNN)的原理和使用方法。 关于深度学习,我已经为你讲解了不少内容了。 咱们简单回顾一下。常见的深度学习任务,面对的 数据类型 主要是三类: 第一类,是结构化数据,也就是样本和属性组成的表格。例如《 如何用Python和深度神经网络锁定即将流失的客户? 》一文中,我们用到的表格: 这种数据格式,最为简单。你也很容易理解深度神经网络的结构和处理方法。 第二类,是图像数据。《 如何用 Python 和 fast.ai 做图像深度迁移学习? 》一文中,我给你详细介绍过如何用卷积神经网络来处理它。 第三类,是序列数据,例如文本。《 如何用 Python 和深度迁移学习做文本分类? 》一文里面,咱们已经展示了如何使用 fast.ai 提供的语言模型对其进行处理。 其中,图像和序列数据,处理起来更需要你对深度神经网络结构的理解。 作为文科生,你在学习卷积神经网络和循环神经网络的时候,可能会遇到一些问题。因为它们大多采用比较复杂的结构图和公式进行描述。 当然,你看到了,即便你对于循环神经网络不了解,把它当成一个黑箱,你依然可以用高阶的深度学习框架,例如 fast.ai ,执行自然语言处理任务,而且效果还很突出。 François Chollet 在他的 Deep Learning with Python 一书中,也提到过这种观点(注意这里说的是 RNN 的一个变种,叫做 LSTM): you don’t need to understand anything about the specific architecture of an LSTM cell; as a human, it shouldn’t be your job to understand it. 但是注意, François Chollet 后面还有一句话: Just keep in mind what the LSTM cell is meant to do. 也就是说,它的实现细节,你不需要考虑。 当然,它的作用,你还是得了解的。 如果你需要做研究,就得针对具体的任务,对神经网络中的各种模块进行调整、拼装和整合。 这时候,如果你对深度神经网络的理解,基本上等同于黑箱,那么你甚至都不知道该如何把它的输出和其他模块拼接起来。 之前,我给你做了个视频讲解《 文科生如何理解卷积神经网络? 》,为你把卷积神经网络的原理进行了拆解剖析。 从读者和观众们的反馈来看,许多人觉得有帮助。 有不少人留言,希望我以同样通俗易懂的讲法,讲讲用于处理序列数据(例如文本)的循环神经网络(Recurrent Neural Network, RNN)的原理。 其实,我也早就想为你讲解这一部分的知识。无奈序列是个动态的概念,所以用文字来给你讲解循环神经网络模型,效率不高。 好在,我最近刚刚学会,如何在录制视频的时候,使用手写输入。于是我立即把这一技术,纳入到咱们的教程制作中来。 我花了一个晚上的时间,为你做了这份视频教程。已发布到了腾讯视频,链接在 这里 。 从我们耳熟能详的一个故事讲起,触类旁通,让你更容易理解循环神经网络的作用、特点和结构。 除了前文提到的一些材料,视频中还提及了词嵌入(word embedding)的相关知识。这一部分,你可以参考《 如何用Python处理自然语言?(Spacy与Word Embedding) 》和《 如何用 Python 和 gensim 调用中文词嵌入预训练模型? 》。 希望这份视频教程,对你了解循环神经网络能有帮助。 祝(深度)学习愉快! 喜欢请点赞。还可以微信关注和置顶我的公众号 “玉树芝兰”(nkwangshuyi) 。 如果你对 Python 与数据科学感兴趣,不妨阅读我的系列教程索引贴《 如何高效入门数据科学? 》,里面还有更多的有趣问题及解法。
9517 次阅读|0 个评论
地理栅格计算器(Raster Calculator in Geography)——功能更新:深度学习遥感分类和遥感反演
热度 1 zhangch3348 2018-10-5 13:40
地理栅格计算器(Raster Calculator in Geography) ——功能更新:深度学习遥感分类和遥感反演 本程序以 MATLAB 的编程语言为基础,主要通过大量分析方法和多种栅格数据,从多角度考虑,初步设计出适合于栅格数据的程序包;提高数以万计的栅格的运算效率;建立适合于不同地域数据的多种分析方法的程序包;最终实现地理栅格数据的智能化处理,提高了数据的处理效率。期望可以将地理信息系统与 MATLAB 的数据处理系统紧密联系起来,对其他地学问题的处理有重要的应用价值和启发意义。 更新功能:基于卷积神经网络的遥感分类和遥感反演,提供分类网络:自定义、 UNet 、 Vgg16 和 Vgg19 。 \0 \0 一、常用工具( Utility ) 1 、批量裁剪( Extract ) 2 、数据形式转换( Data Transfer ) 3 、谐波分析( Harmonic Analysis of Time Series, HANTS ) 4 、 Whittaker 平滑( Whittaker Smooth, WS ) 5 、读入 TIFF ( Read from ) 6 、保存为 TIFF ( Save to ) 二、相关分析( Correlation ) 1 、相关系数( Correlation Coefficient, CC ) 2 、偏相关系数( Partial Correlation Coefficient, PCC ) 3 、时滞互相关系数( Lag-time Correlation Coefficient, LCC ) 4 、时滞偏相关系数( Lag-time Partial Correlation Coefficient, LPCC ) 三、变化特征( Change Characteristics ) 1 、线性趋势( Linear trend ) 2 、 Sen 趋势( Theil-Sen trend ) 3 、单调趋势( Kendall-tau ) 4 、 MK 检验( Mann-Kendall test ) 5 、分段线性回归( Piecewise Linear Regression ) 6 、 Hurst 指数( Hurst ) 7 、标准差( Standard Deviation, STD ) 8 、变异系数( Coefficient of Variation, CV ) 9 、经验正交函数( Empirical Orthogonal Function, EOF ) 10 、复经验正交函数( Complex Empirical Orthogonal Function, CEOF ) 11 、奇异值分解( Singular value decomposition, SVD ) 四、模型( Model ) 1 、土壤侵蚀( Soil Erosion ) 2 、单个栅格温度植被干旱指数( TVDI ) 3 、多个栅格温度植被干旱指数( TVDIs ) 五、 CNN 遥感分类 1 、预处理 2 、遥感影像采样 3 、网络构建和样本训练 4 、遥感分类 5 、中值滤波 6 、分类精度 六、 CNN 遥感反演 1 、遥感影像采样 2 、网络构建和样本训练 3 、遥感反演 图 1 地理栅格计算器菜单界面 图 2 基于卷积神经网络的网络构建和样本训练界面 图 3 基于 4 种不同网络结构的遥感分类结果 表 1 遥感影像分类误差矩阵 注:混淆矩阵、类别精度与总体精度单位均为 % 。 附注: 深度学习网络包括卷积神经网络(CNN)、循环神经网络(RNN)、深度信念网络(DNN)等。其中,卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。它包括卷积层(convolutional layer)和池化层(pooling layer)。卷积神经网络是近年发展起来,并引起广泛重视的一种高效识别方法。20世纪60年代,Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈神经网络的复杂性,继而提出了卷积神经网络。现在,CNN已经成为众多科学领域的研究热点之一,特别是在模式分类领域,由于该网络避免了对图像的复杂前期预处理,可以直接输入原始图像,因而得到了更为广泛的应用。 鉴于地物反射特性与地类关系的复杂性以及传统方法的缺陷,拟采用CNN方法,提出基于深度学习网络的遥感影像解译方法,通过抽取更抽象的特征来建立遥感数据与地类之间的最优模型,从而提高遥感影像解译精度。该程序主要根据CNN的三种图像处理方法进行遥感解译,分别为语义分割(Semantic Segmentation, SS)、图像分类(Image Classification, IC)和序列分类(Sequence Classification, SC)。
个人分类: 深度学习|9052 次阅读|1 个评论
从端到端到平行智能 -- 人工智能前瞻
热度 8 heruspex 2018-9-13 06:43
在人工智能第三波热潮中,深度学习的端到端理念被广泛采用,在后续研究中还有什么方向值得去尝试呢? 从端到端到平行智能 ----- 人工智能前瞻 张军平、陈德旺 如果把人工智能的终极目标看成是模仿人类的大脑,那么神经网络研究的兴衰,至少在目前来看,就几乎等同于人工智能的大半个发展史。 一、现在:端到端 从 20 世纪中叶人工智能界的先驱 McColluch 和 Pitts 发现了神经元的“兴奋”、“抑制”算起,到 1956 年 Rosenblatt 提出感知机模型,可称其为盛世,再到 Marvin Minsky ( 马尔文 明斯基 )1969 年出版的 Perceptron 引发的衰败,算是第一次高潮。这轮高潮主要是学术圈的自嗨。 从 1986 年 Remulhart 反向传播 (BP) 的提出,到 1989 年 Hornik 和 Cybenko 等 万能近似定理( universal approximation theorem )的推出,到各种较深层的非线性神经网络的流行,再到 1995 的统计学习理论开始一统江山。 BP 算法被认为只是把大家的视野又重新吸引回神经网络,算是人工智能的第二次高潮。这仍是以学术圈的自娱自乐为主。 从 2006 年 Geoffrey Hinton 首次在《 Science 》杂志上发表深度伯兹曼机模型、研究者对神经网络的十年怕井绳的观望心态,到 2012 年深度模型 AlexNet 首次在 ImageNet 大规模图像识别竞赛中大获全胜,再到各类考虑深度、宽度、多尺度、多模态、对抗、自编码、注意力的深度模型的提出。学术圈和产业界都进入了深度狂欢状态,这是第三波高潮。虽然在技术层面,并没有非常明显的理论上的突破,更多的是由于大数据或数据增广带来的模型描述能力以及硬件 GPU 算力的提升。虽然,因为前二次热潮的教训,相关人员都清楚过度吹嘘人工智能前景可能带来的风险。但是,人在江湖,身不由已。学者、学生、资金都已经前赴后继地投身到人工智能产业化的道路上,希望能抢先一步能形成垄断优势、行业壁垒。最好能成江湖三足鼎立之势,再谋独孤求败之实 。各大人工智能公司开出的诱人高薪真应了那句话“ 21 世纪什么最重要,人才!” 这一波热潮中,人才的背后其实是端到端的概念在支撑着。一如人工智能上一波低潮时,但凡提到自己是做“神经”,就容易发生类似于基金项目直接被枪毙、被鄙视为缺乏统计意义等各种杯具一样。现下如果不提到“端到端 ”,就很难让神经网络占了大半壁江山的科研人员认可你成果的意义了。端到端也成了近几年人工智能最时髦的名词。 一方面,端到端确实解决了一个大的问题,即对领域知识的掌握程度。以往在不同领域的应用,必须有专业的人员参与。而端到端的模式,将这些知识的学习都化归为网络权值的自学习,从而大幅度减少了对专业知识的依赖。直接后果就是产业界和学术界的同化现象。我在之前写的文章中“ 童话 ( 同化 ) 世界的人工智能 ”中分析过这一现象。 可是,端到端的设计理念也引来了不少的吐槽,比如模型的可推广性问题、以及对人类强人工智能的不可企及问题等。 人们也在思考,如果要延续这一拨热潮,得敢问路在何方呢?仍然是迷一般的、人类的思维该如何引入呢?除了端到端,还有什么方向值得去尝试呢?不妨回头看下大约在第二波人工智能热潮时期甚至更早期的一些大家的思考。 二、过去:思维科学 谈到思维,不妨先想想我们认人的习惯。当人在远处时,有多少人是先看人脸的呢?尤其在距离非常远的时候。对于熟悉的人,我们实际上会很自然地可以根据他或她走路的轮廓变化来判断。这与多数深度学习看重非常精细的特征是不同的,是一种整体认知的方式。 图 1 步态轮廓图 研究人类整体认知行为的理论和方法都挺多的,比如格式塔心理学、比如中科院心理所的陈霖院士提到的大范围优先理论,甚至中国的阴阳八卦、易经中多少也包含了这样的思想。据我所知,以阴阳八卦来研究的有香港中文大学的徐雷教授,基于易经研究的有 IEEE Fellow 、澳门大学的讲座教授陈俊龙。不过,整体认知有个比较普通、难以克服的问题,就是如何量化、程序化。 除了整体论的思考外, 90 年代初期钱学森院士曾指出,要研究人的智能,也许可以从逻辑、形象、创造这三个递进的层次去着手研究思维科学 (Noetic Science) 。他认为通过思维科学中的递进性的研究,有可能实现 20 世纪初期哲学家怀海德在与其学生罗素合著书籍《数学原理》中的思想。后来怀海德又将其思想进一步升华,提出了“过程哲学”观点。在 1929 年出版的、著名的形成上学书籍或“过程哲学”经典书籍《 Process and Reality 》(过程与实在)中,怀海德曾指出,人的认知、社会的认知最终可以上升到一种自我成长、自我成熟的阶段,正如现在的宇宙演化。在这一“过程”思想中,他将哲学的考虑转到对科学与技术的考虑上, 提出了虚实共存形成过程的概念。换句话说,就是虚实平行,永恒的不断纠缠、不断演绎的过程,而算法的实现就可以考虑平行智能体系。 图 2 : 左:《过程与实在》 ( 怀海德 ) ; 右:《哥德尔 - 逻辑的生活》 (John L. CASTI, Werner DePauli) 在思维科学的研究中,还有一位西方的智者也必须提一下,那就是哥德尔。他最著名的是打破了早期“怀海德思想”的、为人工智能奠定基础的“哥德尔不完备定理”。简单来说,就是没有一个定理是完备的,不能证明其为真,也不能证明为伪。这个定理写得非常的聪明,因为你说它不完备,那它就是对的;如果你说它是完备的,那也表明了他是对的。和他这个定理类似的还有波普的科学证伪理解。他从另一个侧面说明了,能称之为科学的东西必然是存在解释不了的现象。否则就是伪科学。 除了这不完备定理,哥德尔在晚年一直想证明更为“广义的不完备定理”,即他认为要么人类是能超过所有计算机的、要么数学不可能是由人类创造的,要么两者都成立。后来他将注意力集中到第一条。 他认为在人类思维超越计算机这事上,存在两个可以比较的不等式;最高的是想象智能,这一智能只有部分可以通过语言的形成表达,即想象智能大于语言智能;而在现有的计算机体系结构上,又只有部分的语言智能能够通过算法呈现,即语言智能大于算法智能。比较巧的是,我国哲学家老子写的《道德经》中“道、可道、非常道” 似乎也表达了同样的哲理;“道”是敢干,是创业的基础,是算法智能;“可道”是敢说,是创新的基础,是语言智能;“非常道”是敢想,是革命的基础,也是想象智能。 � 图 3 :左:道德经; 右:钱学森书摘录 钱学森在 1995 年指出,逻辑智能是机器可以完全完成的,比如吴文俊的机器证明便是如此。后两者则需要人或完全只能人来完成。但它们的提升都不开信息网络的支持。不仅如此,爱因斯坦也表达过他对智能观的认识,认为“智能的真正标识不是知识,而而是想象”。 时间飞快,从钱学森提出思维科学已经过了近三十年,从怀海德的过程哲学理念甚至已经提出了一百多年了。在人工智能如此热火的今天,有没有可能基于现在的软硬件条件来部分实现他们的观点呢? 三、未来:平行? 回顾怀海德提出过程哲学的历史,可以发现其主要出发点是来源于 20 世纪初物理学界的两朵乌云所导致的牛顿经典力学的颠覆。那么,在数据世界、在人工智能领域,会不会发生类似的情况呢?我们来做些分析和比较。 在百年前完全没见过大数据的时代,人们分析世界、观察世界往往是基于很少甚至个例的样本集,但却能形成非常重要的普适定律、大定律。比如牛顿被掉下的苹果砸出的万有引力定律。虽然只是科学史上的传奇故事,但多少也反映了数据量并不需要太多。当然以当时的情况,也无法获取多少。 图 4 :牛顿、苹果、万有引力 随着时代的变迁,数据的规模也在不断增加,于是我们发现世界的发展变得不再像牛顿物理学时代那么确定了。再也无法出现阿基米德所说的,给个杠杆,就能把地球撬起来的情况了。世界的不确定性在增加,要模拟真实世界的变化也变得有些代沟了。 到了 21 世纪,随着采集设备的廉价化,数据也因此能相当方便和便宜的获取。丰富的数据也使得模型刻画世界的不确定性,从 certainty 变到 probable ,再变到了现在的 possible 。而在深度学习与大数据的双重推动下,我们可以看到在人工智能及相关研究领域呈现了一个非常明显的特点,就是大数据、小规律。 深度学习的模型在特定问题的预测优异性,较传统学习方面很明显,但往往在参数寻优收敛后,就只适用于模型训练所对应的特定问题,而不具备推广性。究其原因,我在“ 深度学习,你就是 116 岁的长寿老奶奶 ”和“ 童话 ( 同化 ) 世界的人工智能 ”中有过探讨。从某种意义来看,这一现象也正是大数据、小规律的表现。 图 5 :小数据大定律 vs 大数据小定律 另外,现今人工智能的发展趋势与一位经济学家默顿 · 米勒的观点也很契合,即默顿定律 (Merton Laws) 。该定律认为,人最理想的情况是自我预言,自我实习。举个不恰当的例子,据说杨振宁约 12 岁的时候,就喜欢看很多物理学方面的书籍。有次在上学的时候,他从艾迪顿的《神秘的宇宙》里看到了一些新的物理学现象与理论,便表现了极大的兴趣。回家后就跟父母开玩笑说,将来要拿诺贝尔奖。结果梦想真的实现了。这就是默顿定律的体现,是一种自我预言、自我激励、自我实现。另外,默顿定律里还有一个重要的观点,即人必须参与到循环中,机器智能与人类智能协同、混合。 那我们在大数据环境下,其实也可以看到这样一种可能,即大数据背景下的默顿定律,或者说通过大数据来将模型世界封闭,形成对实际世界的逼近,从而可以完成对无穷多小规律的生成演绎。 要实现这样的封闭,最直接的策略就是利用大数据来建立一个与实际社会平行的人工社会,从而填补模型世界与实际世界的代沟。 这样的系统构造模型与两位管理学大家的想法是一致的。一位是 Deming , 他曾说过“非上帝不信,非数据不认”的名言。他认为现今人类的决策有 85% 是不合理的,因为缺乏数据。如果数据充分,那计算对世界的指导将会有三个递进的层次:描述、预测和引导,分别对应于以数据来说话、预测未来、引导未来。而 Drucker 则认为“最好的预测世界的方式就是创造它”。那么,通过生成大量数据来建立平行系统,正吻合了这两位的观点。 不过,要让两者得到有机的混合,实现两位大家的思想,还得再构造三套额外的系统来支撑。一套用于管理和控制虚实之间的差异,一套用于实验与评估虚实之间的差异系统,一套用于学习和训练虚实系统。 这样,就形成了平行系统或平行智能的基本框架。 图 6 : 平行智能的框架 大致来说,这套平行系统可以利用数据驱动来实现描述性的计算,利用预测和分析实现预测式计算,利用引导式计算来引导未来。对应三个子系统,我们可以构造人工社会 (A) 来实现描述性计算,通过计算实验 (C) 来预测分析,并构造平行执行 (P) 来学习和自适应。并在信息化、自动化、智能化的驱动下,形成具有敏捷性、可聚焦特定小规律、易于发现规律能收敛的人在回路的混合系统。最终实现 Deming 所想要达到的目标,即描述智能、预测智能和引导智能,也就可以将钱学森想刻画的递进思维科学、甚至《道德经》中的道、可道、非常道进行完美呈现。 图 7 :描述、预测与引导智能 有没有人想过呢?王飞跃教授在 2004 年就有过这样的思想,并提出了基本的框架。而 LeCun Yan 在 2016 年预测学习 (Predictive Learning) 的报告中,也提到了引入人工环境的想法。另外,关于如何实现构造复杂大世界, Ian GoodFellow2014 年提出的 生成式对抗网 事实上已经是这么处理。它正是在一个封闭的网络中,通过判别器和生成器的反复对抗,来不断地自我预言、自我完善、自我实现中。 图 8 :左: Lecun Yan 的平行观; 右 : Ian GoodFellow 的数据虚拟生成对抗 Lecun Yan 和 Ian GoodFellow 提供了一个可实现的渠道。那还有其他可行的方案吗?基于现在环境,我们推测有几种可能。一是建立虚拟环境,这一环境的建立可以考虑基于现在成熟的游戏引擎来构造,也可以考虑虚拟现实技术;二是混合,目前有的增强现实技术,可以认为是人机混合的一种方式,在此基础上再构造人工社会,那会就可以形成混合的闭环境。数据、平行、混合,在这一平行系统中,有可能过程哲学一样,系统能自我预言,自我成长,自我完美。也就可能实现从最初的牛顿定律向默顿定律的突破,从 UDC(不确定性、多样性、复杂性) 到 AFC(灵活性、聚焦性、收敛性) 的突破,为今后能发现超越深度学习的小规律作更强的准备。 图 9 :左:从 UDC 到 AFC ; 右:实际系统与人工系统 这一方法也不是在分布式系统中常采用的分治,因为它意味着要将复杂数据简单化和分拆。平行智能则不同,是希望在实际系统的基础上引入大量虚拟系统,实现对混合系统的复杂化,这样才有可能在理论上保证默顿定律的有效和可实现。在此基础上,将波普尔 (Karl Popper) 认为的三重世界 --- 物理世界、心理世界、人工世界 --- 通过物理空间和网络空间虚实混合,将人在回路的混合智能有机地体现在社会物理网络系统 (CPSS) 中,并通过 ACP 的平行认知系统来实现。 图 10 :复杂系统的分治 ( 并行 ) vs 平行 图 11 社会物理网络系统与平行认知系统 事实上,我们现在已经在一些系统上能看到这一框架的端倪。比如 AlphaGo 的围棋系统,一方面,他目前的战绩对人类是接近全胜,另一方面,你还能从中看到另一层信息,即他正通过巨量虚拟数据的训练来获得少量的规律。这些规律突破了围棋界近 300 年的既成棋谱,也让很多高段位棋手开始重新思考围棋的下法,甚至开始采用 AlphaGo 、 AllphaZero 归纳出来的少量规律来下棋。而这些策略其实和我们上面提到的大数据小定律的发展是吻合的。 图 12 : Alpha 从大数据中获得的小规律 不过,我们还得自问一句,平行智能能实现吗?我觉得有可能,但一定有山一般的难题在等着解决,比如复杂系统中的协调问题、实验评估问题等。不过鲁迅也说过“世界上本来没有路,走的人多了,也就变成了路”。 张军平 2018 年 9 月 13 日 后记: 2018 年 9 月 7 日到 9 日,中国自动化学会混合增强智能专委会在西安交通大学举办了首届混合增强智能讲习班,主题是“人在回路的混合智能”。讲习班邀请 了 11 位国内在混合智能方面的著名专家。其中王飞跃教授安排在 9 月 9 日上午,做平行智能方面的报告。比较遗憾的是,教授讲习班开班日感冒,嗓子完全不能发声,便委托我来代讲。我虽然听过好几次教授的报告,但毕竟台上台下是不一样的,始终是一知半解。所以,晚上便和王教授以前的博士生、也是我的同学 --- 福州大学的陈德旺教授,一起分析和解读了教授发过来的 PPT 内容。因为怕讲不好,我便结合了我自己的研究方向,改题目为“从端到端到平行”来讲了。本文是根据报告内容整理后的文章。 算下来,好象有很长时间没跟德旺合作写文章了。我记得第一面见他的时候,是在中科院自动化所博士入学考试的时候。他年轻,一幅挺不可一世的样子。不过后来入学后,住同一层久了,大家熟悉了,就玩得开了。有过一次,他跑我寝室,两人一起唱歌,结果他的歌声让走廊对面的同学出离愤怒,过来敲门抗议了。再后来,我发现高维非线性数据降维问题很有意思,而交通方面也没有相关的研究。王教授听说了,便鼓励我和德旺一起合作,最后形成了流形学习(Manifold Learning)在智能交通的第一篇应用文章 (Chen et al., 2004) ,是基于一维流形、即主曲线来分析交通流问题。毕业后,虽然各奔东西,不过合作的文章还是有一些 ( 附于后,算是纪念 ) 。 2010 年的时候,我在北京见过王教授一面,两人一起在北京王府井的一个店吃了顿饭。教授跟我说,数据驱动的智能交通应该是未来的发展方向,建议我写一篇综述。我爽快地答应了,然后花了至少十个月的时间完成了这项工作 (Zhang et al, 2011) 。认真的事呢,总是有好的回报的,这篇文章现在是 ESI 高倍引。后来有回我还跟教授说过,如果当时在“ Data-Driven ”前加个 Big ,说不定会更受重视,因为论文发表后,大数据的热潮就兴起了。 参考文献: 1. Junping Zhang, Fei-Yue Wang, Kunfeng Wang, Wei-Hua Lin, Xin Xu, Cheng Chen, Data-Driven Intelligent Transportation Systems: A Survey, IEEE Transactions on Intelligent Transportation Systems, vol. 12, no. 4, pp. 1624-1639, 2011. 2. Junping Zhang, Xiaodan Wang, Uwe Kruger, Fei-Yue Wang, Principal Curve Algorithms for Partitioning High-Dimensional Data Spaces, IEEE Transactions on Neural Networks, vol. 22, no. 3, pp. 367-380, 2011. 3. Junping Zhang, Uwe Kruger, Xiaodan Wang, Dewang Chen, A Riemannian Distance Approach for Constructing Principal Curves, International Journal of Neural Systems, vol. 20, no. 3, pp. 209-218, 2010. 4. Junping Zhang, Dewang Chen, Uwe Kruger, Adaptive Constraint K-segment Principal Curves For Intelligent Transportation Systems, IEEE Transactions on Intelligent Transportation Systems, vol. 9, no. 4, pp. 666-677, 2008. 5. Dewang Chen, Junping Zhang, Shuming Tang, Jue Wang, Freeway Traffic Stream Modelling based on Principal Curves and its Analysis, IEEE Transactions on Intelligent Transportation Systems, vol. 5, no. 4, pp: 246-258, 2004. 延伸阅读: 1、 深度学习,你就是那位116岁的长寿老奶奶! 2、 童话(同化)世界的人工智能 3、 AI版“双手互搏”有多牛? 浅谈对抗性神经网络 4、 爱犯错的智能体 – 视觉篇(一): 视觉倒像 5、 爱犯错的智能体 - 视觉篇 (二):颠倒的视界 6、 爱犯错的智能体 - 视觉篇 (三):看不见的萨摩耶 7、 爱犯错的智能体 - 视觉篇(四):看得见的斑点狗 8、 爱犯错的智能体 – 视觉篇(五):火星人脸的阴影
12721 次阅读|18 个评论
从傅里叶分析角度解读深度学习的泛化能力
xuzhiqin1990 2018-8-24 19:03
深度学习成功地应用在很多领域,但对它的理论理解却非常缺乏。这两年,很多理论学家把关注点放在一个关于深度学习与传统学习理论的悖论上。在传统学习理论中,模型的参数越多,模型一般会更好地拟合训练数据,但模型的泛化能力(拟合测试数据集的能力)会变差。在深度学习中,参数的数目比训练数据集要大得多,但深度网络( DNN)却通常既能拟合好训练数据,又保持良好的泛化能力。这个违反直觉的现象被大家称为“明显悖论” (apparent paradox). ▲ 文献 1 ▲ 文献 2 ▲ 文献 3 频率原则(F-Principle) 最近有几篇文章 从傅里叶分析的角度,在实验和理论上揭示了该悖论背后的一种机制。 一般来说,在深度学习中,大家用来测试结论的例子或者是手写数字集(MNIST),或者是图像分类集(CIFAR)。这两类数据集相对实际应用的数据集确实已经足够简单,但在分析上,它们仍是非常复杂的,因为它们的输入维度仍然非常高(像素点的个数)。 我们可以从拟合一维函数出发考虑这个问题。训练数据集是少数几个均匀采样数据点,如果用多项式去拟合,阶数很高的时候(大于数据点个数),拟合的结果通常是一个能够精确刻画训练数据但振荡厉害的函数。但如果用 DNN,无论多大规模,通常学习到的曲线都是相对平坦的。因为是一维函数,所以很容易想到,振荡和平坦可用傅里叶分析定量地刻画。于是就自然能猜想到,DNN 在学习的时候可能更加偏爱低频成分。 下面是一个一维函数的例子 (图 1a 中的黑点),对数据作离散傅里叶变换后如图 1b 所示,考虑图 1b 中的频率峰值(黑点)在训练中的相对误差,如图 1c,频率越高,收敛越慢(蓝色表示相对误差大,红色表示相对误差小)。频率原则可以粗糙地表述成: DNN 在拟合目标函数的过程中,有从低频到高频的先后顺序。 (Frequency Principle or F-Principle in , or spectral bias in ) ▲ 图1 F-Principle 并不是一个陌生的概念,而是我们日常生活中经常都在用的一个原则。想象一下,如果让一个人去记住一个没见过的东西,一般比较粗糙的轮廓信息会先被记住,然后再是很多细节。没错,DNN 也正是使用了这样的一个学习过程。举一个例子,我们来训练一个 DNN 来记住一张图片。DNN 的输入是一个位置坐标 (x,y),我们希望它输出这个位置对应的灰度值。图 2 的一系列图展示了不同训练步数,DNN 学习到的图像,正如我们前面所猜测的从粗糙的轮廓到细节的学习过程。 ▲ 图2 经验上理解深度学习的泛化能力 一般来说,“平坦”简单的函数会比振荡复杂的函数有更好的泛化能力。DNN 从目标函数的低频成分开始学习。当它学到训练数据的最高频率的时候,此时频率空间误差趋近于零。因为频率空间的误差等于实域空间的误差,所以它的学习也基本停止了。这样深度学习学到的函数的最高频率能够被训练数据给限制住。对于小的初始化,激活函数的光滑性很高,高频成分衰减很快,从而使学习到的函数有更好的泛化能力。 对于低频占优的目标函数,小幅度的高频成分很容易受到噪音的影响。基于频率原则,提前停止训练(early-stopping)就能在实践中提高 DNN 的泛化能力。 理论上理解深度学习的泛化能力 从低频到高频的学习原则并不总是对的,比如在文献 中讨论到的,如果目标函数是随机数据点(频率空间没有低频占优的特性),或者 DNN 的参数的初始化的值比较大,这个原则就会失效。特别是在大初始化的情况下,DNN 的泛化能力也会变差。 文献 对 DNN 学习到的函数的频率幅度的估计并不能解释这些现象。特别地,对于层数和神经元数目足够多的 DNN,文献 给出的理论不能解释为什么 DNN 从低频开始学习。在文献 中,DNN 的拟合函数的高频成分受权重(weights)的谱范数(spectral norm)控制。对于小规模的DNN,可以经常观察到,权重的范数随训练而增长,从而允许小规模的 DNN 去拟合目标函数中的高频成分。因此,文献 在理论上给出频率原则的一种可能解释。 但如文献 的一个例子所示(下图,图 3a 为目标函数,图 3b 为其离散傅里叶变换),对于层数和神经元数目足够多的 DNN,权重的谱范数(图 3c)基本不变。但如图 3d 所示的频率成分的相对误差,四个重要的频率峰值(图 3b 的黑点)仍然是从低频开始收敛。对于这种情况,文献 对 DNN 的拟合函数的高频成分的上限估计在训练过程中基本不变,从而不能看出低频到高频学习的频率原则。 ▲ 图3. 说明:(d) 展示 (b) 中四个频率峰值在训练中的相对误差 文献 给出了能够解释这些问题的理论框架。从只有一层隐藏层的 DNN(sigmoid 作为激活函数)开始,在傅里叶空间分析梯度下降算法,文献 得到损失函数 ω 在任一频率分量上对任一参数 的导数。 其中,a_j 是 Θ_jk 对应神经元的权重(weight),G_jk (Θ_j,ω) 是关于对应神经元所有参数和频率 ω的一个多项式,A(ω) 是学习到的函数与目标函数的差的幅度。文献 论述了这个表达式如何定性的推广到一般 DNN。 上面这个式子显示地定量地说明了 在梯度下降过程中低频成分会有更高的优先级 。但同时需要注意的是, 这个优先级不只是由频率决定,它也依赖于拟合函数与目标函数的差的幅度。 这个理论分析揭示了对于低频占优的目标函数,当 DNN 的参数是很小的数时,低频成分会先收敛,并且在低频成分收敛的时候,DNN 的高频成分仍然很小。而当 DNN 拟合高频成分的时候,已经收敛的低频成分只会受到很小的干扰。对高频占优的函数,整个训练过程就会变得复杂。低频容易受到高频的影响,所以低频是振荡式的收敛,每振荡一次,偏离的最大幅度就会下降。并且频率越低,振荡越频繁(如下图 4 所示)。 ▲ 图4 对于初始化的问题,这个理论框架也给出了解释。如果初始化权重很大,由于上式中的 很大,低频不再占优,所以频率原则就很容易失效。并且,激活函数的高频成分也会变大。对于那些频率高到训练数据也看不到的成分,因为训练过程不能限制它们,所以在训练完成后,它们仍然有比较大的幅度而导致 DNN 的泛化能力变差。 总结 傅里叶分析的理论框架非常好地解释了 DNN 为什么在拥有大量参数的情况下既能学好训练数据,又能保持好的泛化能力,简单地说, 由于频率原则,DNN 学习到的函数的频率范围是根据训练数据的需要而达到 。对于那些比训练数据的最高频率还高的频率成分,DNN 能保持它们幅度很小。 用傅里叶分析的角度来研究 DNN 的学习问题仍处于开始的阶段,有很多有趣的问题值得继续深入,比如更加定量地分析 DNN 的学习过程,理解层数和每层宽度对训练的不同贡献等等。 致谢: 感谢张耀宇对本文初稿的校正和修改。感谢paperweekly将本文发布在其公众号。 参考文献 . Zhi-Qin J. Xu, Yaoyu Zhang, Yanyang Xiao. Training behavior of deep neural network in frequency domain, arXiv preprint arXiv: 1807.01251. (May 18, 2018 submitted to NIPS, first submitted to arXiv on Jul 3, 2018) . Nasim Rahaman, Devansh Arpit, Aristide Baratin, Felix Draxler, Min Lin, Fred A. Hamprecht, Yoshua Bengio, Aaron Courville. On the spectral bias of deep neural networks, arXiv preprint arXiv:1806.08734. (First submitted to arXiv Jun 22, 2018) . Zhi-Qin J. Xu. Understanding training and generalization in deep learning by Fourier analysis, arXiv preprint arXiv: 1808.04295. (First submitted to arXiv on Aug 14, 2018)
个人分类: 深度学习|3402 次阅读|0 个评论
什么是机器学习
热度 3 xying 2018-8-6 10:13
2016 年开启了人工智能的时代。 AlphaGo 围棋胜了人类,轰动地冲击了人类的自信;微软 ASR 语音识别结果好过专业速记员;斯坦福大学 ImageNet 的机器已能读出图里的场景; IBM 机器沃森在日本只花 10 分钟完成 41 名病人的诊断,救了医者束手的白血病人,2017年2月还在中国天津给 20 个癌症病人义诊;特斯拉自动驾驶汽车已挤进车流;机器创作歌曲、绘画、诗歌、小说、电影也有了不俗的成绩。现在的人工智能,已经不是几十年前哲学家争论的,影视让大家熟悉的,那种按规则推理的木讷机器。它更像是我们培养的智慧生物,与我们有着同源的智力,其核心是机器学习。我们不告诉它怎么做,而是喂给它样本,让它从中汲取知识,以此自作判断。 这篇文章给学理工的人介绍机器学习。希望只要略懂线性代数和最小二乘法的读者,可以通过数学模型和具体的事例,了解其机制,对涌现在我们身边的人工智能有所认识。 机器学习 什么是机器学习?简单地说,计算机利用输入的样本,调整一个通用数学模型的参数,经过这样调整后,使得这模型能正确地回应新的输入。这个原理在几十年前就用在模式识别,现在计算机能力强了,能使用巨量的模型参数和训练样本,让机器展现出令人惊异的智能,被称为机器学习。 测试人的 IQ ,是让人回答几十道题,每道题列出几张图形,或几组数字,或几个词作为样本,让你从一组可能的选项中挑出一个最“合理”的答案,以此来评估人的智商。这与你拥有的知识无关,测定的是以样本作类比判断的能力。计算机的学习算法,模仿这种类比能力,赋予机器智商。人类具有智商,可以通过学习获得知识。计算机用调整数学模型参数的算法,实现学习的能力。样本的数据潜藏着大量的信息,通过训练给予了机器相关的知识,让机器拥有判断这类数据的智能。 先看一个机器学习的例子。计算机模拟 400 个输入节点 x , 10 个输出节点,具有 25 个隐含层节点的神经网络。 这可以表示成一个 400 维到 10 维实数值向量的函数 F: R 400 → R 10 如下: 神经元联接权重和阈值 w 共有 10285 个,它们是函数的可调参数。式中的 S 是一个 Sigmoid 作用函数 S(z)=1/(1+exp(-z)) ,让函数值饱和在 0 或 1 两端。 机器用它学习识别手写体字时,输入 5000 个各种形态图片的像素矩阵作为样本数据,每个样本是一张 400 个像素的手写数字图片,每个像素对应着一个输入节点,每个输出节点代表输入图片被辨识为的一个类别,输出值表示图片属于这节点类别的相似度。图片中手写表示的数字称为样本的标记,预期对应着具有最大函数值 F i 的那个输出节点 i 的类别。不难想到可以用最小二乘法来计算可调参数 w ,使得机器分类与这些样本标记的误差最小。然后我们可以用这训练好的神经网络,来辨识手写体数字的图片。 机器学习的过程 机器的学习过程是用反向传播误差算法( Backpropagation ),来迭代调整这 10285 个参数,这算法由最小二乘法导出,使得输入样本的标记与对应的输出节点类别判断的平均误差最小。实验通过 50 次迭代取得了 95.26% 的准确率。然后用这个调整好参数的神经网络,来识别新输入的手写体数字,也取得超过 90% 的预测准确率。注意,这个数学模型,即它所描述的这个神经网络功能,是通用的。同一个神经网络的机器,可以用它来学习识别手写体字,也可以用来区分债卷的等级等等,对债卷需要的是描述债卷属性的训练样本,来供给机器学习债卷的知识。同一个算法的机器,用不同的样本数据,赋予机器不同的知识和智能。机器的学习能力,即智商,只受数学模型对数据不同模式的表达能力所限,越多的参数具有越强的表达能力。 通常用多元线性函数和非线性作用函数的简单组合来表示数值规律和划分类别模式,实用中的线性函数参数是以万计到百亿计的数量。这样的数学模型虽然很简单,却因参数数量的巨大能够实现复杂的功能,足以涵盖各种预测和辨识情况。在数学上,这调整模型参数减少误差和应用模型预测的算法,都是精确有效的,但也因变量个数的巨大,难以分析由输入到输出每一步的变化规则,无从归纳成像物理规律那样简单明晰的因果性机制,无法用人脑跟踪逻辑推演的角度来直观理解它的功能。 也许有人认为计算机里的软件是人写的,机器不过实现人给予的功能,怎么算是机器学习? 这混淆了人赋予的功能和机器自己获得的功能。五十年代的感知器( Perceptron )是纯粹用硬件实现的机器学习,那用不上计算机更谈不上软件,那时用了 400 个光学传感器,电动机、滑动电阻和控制电路来实现,它学会辨识猫、狗、鱼的简单图像。这个感知器相当于神经网络中的一个神经元,现代神经网络具有千万个神经元,可以实现非常复杂的辨识问题,计算机和软件只是方便地用来模拟神经网络的硬件功能的手段。现在的训练样本也还是人供给的,但机器通过传感器和网络自己收集样本数据,在原则上并没有什么不可克服的障碍。例如自动汽车驾驶的机器学习,就是机器通过记录车速、油门、刹车、方向盘转角和路况的视频,作为训练机器的样本数据。尽管如此,确实,机器的学习功能是人给予的,但给予的只是学习的能力,机器通过训练的样本自己获得相关的专门知识和由此而来的智能。这就像人类小孩是父母生养的,但知识和能力却是自己通过学习获得的。 机器学习算法 下面介绍几种典型的机器学习基础算法和事例,让大家能够想象它的功能。 无监督学习和监督学习 无监督学习和监督学习是机器学习最基本的两类,其他的类似于它们的综合。最常用的无监督学习是从样本数据分布中,按它们的聚集来分类,例如用一堆新旧不同的人民币硬币尺寸和重量作为样本的数据,它们在 2 维空间的分布聚集在几个地方。人们看了知道它们是分成几类,依此知识可以判断送来的硬币类别。机器也可以这样做,它通过数据点相互距离的计算( K-means ),将相近的数据点的聚集按距离自动分割成几组。得到各组的中心和分布范围后,以此判别新输入硬币所对应的组别。许多事物看来杂乱无章,其实分属不同类别,例如学生潜力,绘画风格,生物分类等等,只要用足够多特征属性来描述,就可以把它们区分,但对于许多的特征属性,人类只能抽取能理解含义的少量特征,很难利用非常多的特征属性来分类,机器却很容易做到。在你现在的工作中,也可能应用现成的 N 维自动分类程序,在已经拥有数据中发现潜藏的分类。 无监督学习就像无师自通的领悟,效率较差,有些情况难以做到。有老师教学就会快得多。监督学习是最成功广泛应用的机器学习,用我们知识来标记样本的正确答案,去“教”机器学会应用。 线性回归 对于数值答案的问题,线性回归是最基础的算法,几百年前人们就用它从实验数据中导出经验公式。采用最小二乘法,求出与这些数据误差最小的直线或超平面。 这里 j 是输入属性的下标, i 是输出向量数值分量的下标, (k) 指第 k 个样本。它有公式解,在线性代数上称为“正规方程( Normal Equation )”的线性方程解。然而,商业应用中的机器学习模型未知参数 的数量巨大,公式解要求非常大的计算机内存和计算量来实现,通常是用梯度法迭代求出近似解。这是被应用最广泛的数值预测的学习方法。 数据关系不能用一个线性式子表示 ​ 怎么办?这可以通过增加一些与输入属性 x 是非线性关系的项,例如令 x 1 =x, x 2 =x 2 , x 3 =x 3 ,… ,有可能把它们表达成一个线性式子 ​ ,即高维空间里这些点可能放在一个超平面上,在样条函数逼近理论上,这已许多有数学研究。在应用上,它相应于选取足够多的输入属性表达。例如房价的估值,所在的地区和房子的面积是基本的属性,当它用线性回归预测误差较大时,加入邻居平均房价,房间卫浴个数,装修等级等等,用这些与已有属性不是线性关系的特征,来扩充属性空间的维数,有可能取得较好的模型精度。 逻辑回归 对于分类模式的判断,逻辑回归是基础的算法。在直观上是用一个超平面把输入属性空间分成两半,逻辑上对应着 0 和 1 。超平面用一个线性函数表示,输出对应于这线性函数值是否大于 0 。多个的超平面将属性空间分成多类。能够这样归类的数据称为是线性可分的。上世纪五十年代 AI 热潮中的感知器( Perceptron ),用一个 Sigmoid 作用函数加在线性函数之后, 让输出结果基本饱和在 0 或 1 ,并且易于用最小二乘法导出减少误差的梯度。它模拟了神经元的功能,它们一列组成的单层神经网络,能很好处理线性可分的模式识别。对于不是线性可分的模式,可以采用上述增加输入特征属性的方法,让它在高维空间上线性可分。 支持向量机 支持向量机( SVM )在单层神经网络基础上,采用非线性变换 φ 将输入的数据向量 x 映射到特征属性空间,让这些 φ (x) 在特征属性空间是线性可分的。它使得线性分类器可以用在非线性分类的问题。这个非线性变换不需要明确给出,它的实现是通过直接构造与特征属性空间中内积相等的“核函数( Kernel function )”来简化计算。支持向量机用分段线性函数代替神经元里的 Sigmoid 作用函数,这样调整间隔分类超平面的参数,就只跟较少的支持点有关了,既可以大大减少计算量,又把计算转化成二次函数在线性约束下求极值的问题。实践中的应用,涉及到巨大稀疏矩阵的计算。 1998 年 Microsoft Research 的 John C. Platt 提出 SMO 算法,可以高效地处理巨量的变量和样本数据,这使得支持向量机获得广泛的应用。支持向量机包含单层感知器作为特例,它有清晰数学理论的支持,能有效地控制训练结果,现在已有许多语言实现的软件包可用,相对于多层神经网络,它所要求的机器资源较少,是非常实用的学习算法。但它要求有应用领域知识的人力合作,来选取合适的核函数。它成功地应用在许多分类领域,如文本、图像、蛋白质、垃圾邮件分类和手写体字识别等等。 神经网络是多层感知器的网络,对每一层输入都用线性来分类,由于 sigmoid 作用函数,每层的输入和输出是个非线性变换,因此不需要人为设计属性变换,便能通用地实现各种数据的分类。文中最初介绍的就是三层神经网络的一个例子。理论上三层神经网络可以实现任何分类问题,但随着复杂程度的增加,要求中间隐藏层的神经元数会急剧地增加。每层神经网络实现一个线性分类函数,多层神经网络则实现了多重的复合函数,能用大大提高学习功能,用较少的神经元解决复杂的问题。但多于三层的神经网络,采用反向传播误差的梯度法来统一训练,较难控制学习的结果,所以兴起深度学习的研究。 深度学习 相对于前面单纯机制的机器学习数学模型,深度学习像是一种综合的工程设计,它基本架构是深层的神经网络,具有处理非常复杂模式的能力。为了提高训练的效果和效率,设计不同层次的网络构造,例如在计算机视觉广泛应用的卷积神经网络( CNN ),便是在低层先采用几个卷积核层和联营层来抽取特征和压缩信息,它们是 “先天”预设功能的神经网络层,具有较少可调的联接参数,能自动获取局部特征,且易于控制训练的效果。在深层网络中有的还采用分层采用无监督的预先学习和随后的监督学习,来提高学习效率。如何构造深度网络和控制训练是深度学习的研究内容。今天深度学习的神经网络已有百亿个神经联接参数,具有极强的智商,它需要巨大的计算机资源和信息数据的支持,多在大公司研究突破性的应用和探索人工智能的未来。 上世纪 80 年代,计算机的功能还不及现在的手机。手写体字识别的研究,应用上述例子中的神经网络来学习,限于计算机的功能和数据的收集能力,用几百个样本逐个迭代更新参数来学习,无论算多少小时,结果都不理想。现在用了 5000 个样本,同一个神经网络模型用批量计算更新参数,经过 50 轮迭代, PC 运行不到 10 分钟就训练好了模型。注意这里用的只是简单 400x25x10 节点的三层网络,已经有了 1 万多个待定的参数,输入样本是 400x5000 的矩阵。这个辨识 10 个数字图像的小项目,过去实现不容易,现在却很轻松。现在机器学习进入了与人类智能相较的时代。斯坦福 ImageNet 的机器学习,用了 1500 万张照片的数据库,涵盖 22000 种物品,对 2400 万个节点, 150 亿个联接的神经网络进行训练,能够让计算机看懂了照片,描述图里的场景。这些成绩证明了在巨量的样本数据和强大的计算能力支持下,凭借着上述非常简单的数学模型的学习机制,便能够使得机器通过训练,从白痴到了具备令人惊异的辨识认知能力。现在深度学习的成就还只是验证概念的破冰式探索,如何构造深度神经网络,怎么更有效地利用数据和利用已有知识更聪明的学习,例如具有长期、短期记忆的神经网络,“一次性的学习( One-shot learning )”等等,正在竞争研究中。 机器学习强大的功能来自巨量的可调参数,它的学习算法并不难理解,基本是向量和矩阵的线性运算,关键之处是巨量的样本数据获取,和支持巨量计算的硬件特别是 GPU 等技术进步。这就是为什么机器学习的突破,一直到了大数据时代才出现。 我们已经用数学模型介绍了机器学习的机制,不难想象它是怎么工作的。实践已经证明,这种学习机制非常成功地让机器获得辨识预测的智能。 但是进一步深思,可能会疑惑,学习算法所得的是与样本误差最小的数学模型,为什么能用它来预测判断样本之外的世界?下一篇《为什么机器能学习》将解答这个问题。 【说明】去年应《中国计算机学会通讯》特邀撰写专栏,我在那里发表些关于AI的系列文章。因为发现有些网站未经同意转载了部分内容,非学会会员不能阅读原版全文,造成一些混淆。所以我将在博客陆续贴出这些文章,以觞有兴趣的读者。这篇文章曾在 2007年4月 《中国计算机学会通讯》上发表,部分文字略有修改。
个人分类: 科普|6229 次阅读|9 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-24 17:59

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部