天文学家和码农是怎样利用人工神经网络协助发现系外行星的?
去年底(2017年)专业天文工作者和不少爱好者们估计都看到过这么一条新闻:
2017年12月15日,谷歌与NASA联合宣布通过机器学习技术新发现了两颗系外行星。其中一颗属于距离地球 2545 光年的 Kepler-90 系统。Kepler-90i 是Kepler-90系统中最小的行星,但仍比地球大30%,表面温度约400°C,并不适合生命生存,公转周期仅为14.4天。
这一发现使Kepler-90系统的行星数量增加至8颗,成为目前在太阳系之外发现的最大行星系统。另一颗行星Kepler-80g大小与地球接近,是Kepler-80系统的第六颗行星。
补充说明一下,这里的Kepler(开普勒)是指由 NASA 于2009年发射的开普勒太空望远镜。其任务是通过观测恒星的光度以检测是否有行星凌星的现象,从而寻找太阳系之外的行星。
开普勒太空望远镜示意图
通过各种数据处理技术分析观测数据是很多天文学家的日常工作。而这条新闻的重点是,当今火热的 “机器学习” / “深度学习” 技术,或者说,被热炒的所谓“人工智能”,已经正式开始在天文数据分析中起作用。
这里我们没有标题党地直接用 “人工智能” 这个字眼。实质上目前媒体所说的 “人工智能” 都是各种类型的 “机器学习” 技术。所有的技术或实现都没有突破人类设计的范围。业界更喜欢用 “机器学习” 这类字眼以示严谨。而 “人工神经网络” 是目前机器学习的一个重要技术,并且也用于这个发现外行星的项目里。
大部分的媒体文章只能到这么简单介绍的程度,没深入了解的爱好者们只能觉得 “人工智能” 神秘莫测。
然而在今年3月份 Google 把这个项目的代码开源了。代码放在全球最大的同性交友网站(划掉)代码共享网站 GitHub,并且配备了说明。
URL 在此:
https://github.com/tensorflow/models/tree/master/research/astronet
本人用业余时间慢慢啃完里面的说明,主要部分的代码,和附带的一篇论文。大致了解了这个机器学习项目的原理。并且用 Keras 框架把里面的神经网络部分重写了一遍,训练神经网络得到类似的结果。
(项目原本的代码用 tensorflow API 直接写,实在看得比较痛苦。。。)
原理
开普勒望远镜对每个恒星观测的数据被整理为一堆 FITS 文件,文件保存了被称为 光变曲线 的数据。这是由开普勒的光度计测量得到的恒星一段时间内的亮度变化。
(很多专业天文数据都用 FITS文件格式存储。有过深空图片处理经验的同学应该不会陌生)
当行星经过恒星前方时(称为 凌星),它会短暂地阻挡一些光线,这会导致测量亮度下降,然后在很短的时间内再次上升,从而在光变曲线中形成“U”形下沉。
资料来源:http://developers.googleblog.cn/2018/04/blog-post.html
当然光度变化也可能由双恒星系统引起(不是行星)。另外,目标恒星本身光度也有起伏。
更重要的是测量本身也有系统误差(噪声),原始数据并非就是上图所示的一条平滑曲线。
内部编号为 11442793 的恒星大概20天里的光变曲线(原始数据):
上图可见一个明显的光度下降。这就是编号为 Kepler-90 g 的行星。但并非每个行星的光变曲线都那么明显。另外恒星本身的光度变化,以及数据的噪声(noise)也明显易见。
这是同一颗恒星,11442793 的大概四年内的光变曲线:
肉眼可见有两个不同的行星导致的变化。最“深”的曲线是编号为 Kepler-90 h 的行星。第二“深” 的是前面提到的 Kepler-90 g。
Google 项目组根据这个原理,建立了一个深度卷积神经网络对已知的光变曲线进行学习。然后用来 判断/预测 新的光变曲线是否为一个潜在的行星候选者。
数据处理分析
对于收集到的海量数据,天文学家用一个叫做 Kepler pipline(开普勒数据处理管道)的自动化软件,检测可能由行星引起的信号,然后手动跟进。
每个可能的目标被标为一个 TCE(Threshold Crossing Events,超越阈值事件)。这个 Google 项目组就是试图对每个TCE 进行分析判断其为行星的可能性。
(其实之前也有其它的分析工具,他们对这个正在开发的神经网络工具和之前的进行了对比,有其优点,也有需要继续改进的地方。)
对于机器学习,提供的训练数据必须先经过预处理,抽取特征,归一化,才能塞进神经网络进行训练或预测。
预处理:
移除目标恒星本身的低频光变起伏。这段代码我没认真看,直接拿来用。
处理前
处理后
特征抽取,归一化:
对于每一个TCE(超越阈值事件),Google 项目在组希望首先通过其光变曲线形状来训练神经网络。因此根据这些数据提取曲线:
事件周期 period
事件中心时间 time0bk (从2009年1月1日00:00开始算的天数)
事件经历时间 duration
整个周期的曲线,称为 global view
事件经历时间段的曲线,称为 local view
Global view 被压缩成一个 2001个元素的数组。
Local view 则被压缩成 201个元素的数组。
不要问我为什么不是 2000 和 200。我也没找到说明~
这样处理的考虑因素是既能保存整个周期的曲线,又能保存局部的细节。因为压缩后在 global view 中有的光变事件只剩下那么一两个像素。
深度卷积神经网络
在看原始代码看得头疼的时候,我直接参考了项目组写的一篇论文:
http://iopscience.iop.org/article/10.3847/1538-3881/aa9e09/meta
所采用的神经网络模型长这样:
Global view 的数据由10个卷积层(Convolutional layer)和5个池化层(Pooling Layer)识别及提取特征。
而local view 的数据只需4个卷积层和两个池化层来提取。
两路输入合并后通过4个 Dense 全连接层(Fully Connected layer)进行分类。最后输出两个类别(是,或 不是)。
在实际的分类中其实还存在多种类别,除了“是” (是行星候选者)外,“不是”的类别还包括 “天文现象导致的假现象,比如X射线” 及 “非凌星现象”。但此项目当前只关注 “是否行星候选者”,所以把“不是”的都归一类,降低模型训练要求。
在其具体实现代码里还留了给更多辅助特征的位置以为日后改进模型留下空间。不过目前公布的代码中没有用到。
训练数据样本
整个开普勒项目产生的光变曲线文件有上 TB。这个项目选取了大约 80G 的光变数据(对应一万多个恒星目标),以及相应的已经检测出来的 TCE 事件的数据,以及 该TCE 事件的判别结果,作为给神经网络模型的训练数据。
根据他们在 GitHub 上面的说明,你按我们这些步骤嘛,先把 80多 G 的数据扒下来,然后把数据转换成需要的格式(特征抽取,归一化) ,然后就可以自己试着训练这个神经网络,训练完之后,可以自己试一下拿新的数据来做预测了!
嗯~ over~
估计没几个人想玩了
所以我决定自己动手试试。
神经网络模型
对照着上面论文的模型,用了流行的 Keras 框架写了一个 (多么的舒坦)
扒取训练数据
项目组给出的是生成一个有一万多个 wget 命令的下载脚本(一个命令对应一个恒星的数据)。为了用多线程下载,我另外用 Python 写了个类似爬虫的程序加快速度。依然有点不够完善有时候网络连接不行了需要重新跑一轮(已下载好的会直接跳过),足足扒了两天。
训练数据转换(抽取特征,归一化)
这里直接用项目组的算法。不过由于项目组是直接用 tensorflow API 写的神经网络模型,数据格式用 TF record 而 Keras 不 直接支持。所以自己另写了一个 Python 程序转换成自己的格式,并另外写了个 Keras generator 给神经网络灌数据。数据转换足足花了4天4夜。主要都是磁盘 I/O 操作,没想到能如何加快。
训练模型
用一张1060 6G 显存的显卡,跑个10分钟左右就能到达目标精度的训练结果了。当然实际上要花不少时间反复调参数再跑再对比。
训练的结果存成一个 .H5 文件,用于后面预测新数据使用。
本着 Talk is cheap, show me the code 的 精神,我的代码也放在了GitHub :
https://github.com/kenluozhenyu/kepler_cnn_in_keras
通过训练之后,能达到对测试集的判别有95% 的准确率的结果,跟项目组的结果类似。
然后按 Google 项目组的介绍,对这样的一个TCE 事件进行预测:
Kepler ID = 11442793 (其实就还是前面例子的同一颗恒星)
事件周期 period = 14.44912 (天)
事件中心时间 time0bk = 2.2 (从2009年1月1日00:00开始算的天数)
事件经历时间 duration = 2.70408 (小时)
神经网络模型预测得到的结果是 99.4% 的可能性为行星候选者!
Google 项目组给出的判断结果是94.8%,我觉得目前不用在意这两者差别。
实际上,这个就是本文章开头提到的通过机器学习找到的新行星,编号Kepler-90 i。
(事实上,即使通过这类工具分析出行星候选者,依然需要通过其它手段验证才能最终确认)
然后我们看看对应于这个TCE 事件的光变曲线分析。用同样的方法,把归一化后的 global view 和 local view 图示出来:
Global view (整个光变周期):
Local view (光变过程):
对比前面的例子,这个光变曲线有何不同?
不同点在于,实在太不明显了!
用科学的语言来说,数据的信噪比太低了,肉眼难以判断。
开普勒望远镜的任务之一是试图寻找跟地球大小类似的系外行星(生命存在的可能性大些?)。然而经过4年多的寻找仍然很难发现这类行星,因为它们太小从而对光变曲线的影响相对微弱。
而这次通过机器学习找到新行星的案例带来了新的希望,意味着有可能在低信噪比,接近 开普勒数据处理管道 精度极限的地方找到类地行星。
Google 项目组把这个神经网络的表现跟其它已有工具对比过,有优胜之处也有不足。优胜在于对低信噪比信号的识别。不足之处在于对一些模拟的假信号辨别率偏低(这一章节没有完全认真看完)。因而在工具能正式上线之前还需继续改良。
开普勒望远镜的寿命不久后会终结,其继任者,新一代的 “行星猎人” TESS (Transiting Exoplanet Survey Satellite)已经成功发射准备投入任务。这个机器学习的分析方法有望应用在 TESS 数据上,因为 TESS 的原理跟开普勒望远镜是类似的。
TESS 艺术图
有不少爱好者参与的天文巡天项目,例如寻找小行星,彗星,新星等,都是通过爱好者肉眼对照不同照片寻找可疑新天体。机器学习技术的兴起,亦有望将此过程自动化,更有效率地分析数据。
获取更多天文咨询,请关注我们的公众号:
QQ群: