https://blog.tensorflowcn.cn/2020/05/galaxy-zoo-classifying-galaxies-with-crowdsourcing-and-active-learning.html
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG-MizmbWBytLcMLDuzbqijOVVSFNG0EtiC-8wNYx2OXplA2g1vaMmEtcabjw9BjLOCyBGdX7qFKthlCqiybx_CHyhHh3GBzUnwCG3qdkv8_H1WQIj501-l8hSmdjYOqsTYvWEUwJPoQ4/s1600/galaxyUI.png
来自牛津大学的 Mike Walmsley 的客座文章
我们做科学的方式正在改变;每天都有指数级增长的数据,但科学家的人数却大致相同。传统的收集数据样本、查看样本、并对每个样本得出结论的方法往往不足。
一个解决方案是部署算法来自动处理数据。另一个解决方案是部署更多“眼睛”:招募公众成员加入并提供帮助。我的工作介于两者之间 - 将众包和机器学习相结合,以比单独使用两者更有效地进行科学研究。
在这篇文章中,我想分享我如何利用众包和机器学习来研究星系如何演化,方法是对数百万张星系图像进行分类。在此过程中,我将分享一些我们用于训练 CNN 的技术,这些技术可以进行具有不确定性的预测。我还将解释如何使用这些预测进行主动学习:仅标记最有利于改进模型的数据。
更好的望远镜,更大的问题
自从 20 世纪 20 年代的埃德温·哈勃以来,天文学家就一直仰望星系,并试图将它们分类成不同的类型 - 光滑的星系、螺旋星系等等。但星系的数量不断攀升。大约 20 年前,一位名叫凯文·肖温斯基的研究生坐在他的办公桌前,面前堆着 900,000 张星系照片,他双手捂着头,心想 - “一定有更好的方法”来对所有星系进行分类,而不必让自己疯掉。他并不孤单。为了在不牺牲凯文理智的情况下对所有 900,000 个星系进行分类,一支科学家团队(包括凯文)创建了
星系動物園。
星系動物園是一个
网站,它要求公众成员为我们对星系进行分类。我们向你展示一个星系,并询问你所能看到的简单问题,例如 - 这个星系是光滑的还是有特征的?当你回答时,我们会引导你沿着决策树前进,其中的问题取决于你之前的回答。
|
星系動物園 UI。看看吧,加入到科学研究中来,这里。 |
自推出以来,数十万名志愿者对数百万个星系进行了分类 - 推进了我们对
超大质量黑洞、
螺旋臂、
恒星的诞生和死亡等的理解。然而,有一个问题:人类无法扩展。星系巡天仍在不断扩大,但我们的志愿者人数始终大致相同。最新的
太空望远镜 可以拍摄数亿个星系的图像 - 比我们仅靠众包所能标记的星系多得多。
为了跟上步伐,我们使用 TensorFlow 构建了一个星系分类器。其他研究人员使用我们收集的响应来训练卷积神经网络 (CNN) - 一种专为图像识别而设计的深度学习模型。然而,传统的 CNN 存在一个缺点;它们并不容易处理不确定性。
训练 CNN 来解决回归问题,方法是预测每个标签的值并最小化均方误差,这是一种常见做法,它隐含地假设所有标签的不确定性都相同 - 这对于星系動物園来说绝对不是真的。此外,CNN 仅提供一个“最佳猜测”答案,没有误差条 - 这使得很难得出科学结论。
在我们的
论文中,我们使用贝叶斯 CNN 进行形态学分类。贝叶斯 CNN 提供了两个关键改进
- 它们在从志愿者响应中学习时考虑了不同的不确定性。
- 它们预测每个星系形态的完整后验。
使用我们的贝叶斯 CNN,我们可以从噪声标签中学习并对数亿个星系进行可靠的预测(带误差条)。
贝叶斯卷积神经网络的工作原理
创建我们的贝叶斯 CNN 主要有两步。
1. 预测概率分布的参数,而不是标签本身
训练神经网络与任何其他拟合问题非常相似:你调整模型以匹配观察结果。如果你对所有收集的标签都同样自信,你只需最小化你的预测与观察值之间的差异(例如,均方误差)。但是对于星系動物園,许多标签比其他标签更自信。
如果我观察到,对于某个星系,30% 的志愿者说“有棒”,我对那 30% 的信心很大程度上取决于回复的人数 - 是 4 人还是 40 人?相反,我们预测典型志愿者说“有棒”的概率,并最小化考虑到所有回复志愿者总数的惊讶程度。
这样,我们的模型就理解了,对许多志愿者回复的星系进行的错误比对少数志愿者回复的星系进行的错误更严重 - 从而使它能够从每个星系中学习。
在我们的案例中,我们可以使用二项分布来建模我们的惊讶程度,因为来自 N 个志愿者的 k 个“有棒”响应非常类似于来自 N 次独立试验的 k 次成功。
loss = tf.reduce_mean(binomial_loss(labels, scalar_predictions))
其中 `binomial_loss` 计算给定我们模型预测的观察标签的惊讶程度(负对数似然):
在 TF 中,我们可以使用以下方法来计算它
def binomial_loss(observations, est_prob_success):
one = tf.constant(1., dtype=tf.float32)
# to avoid calculating log 0
epsilon = tf.keras.backend.epsilon()
# multiplication in tf requires floats
k_successes = tf.cast(observations[:, 0], tf.float32)
n_trials = tf.cast(observations[:, 1], tf.float32)
# binomial negative log likelihood, dropping (fixed) combinatorial terms
return -( k_successes * tf.log(est_prob_success + epsilon) + (n_trials - k_successes) * tf.log(one - est_prob_success + epsilon )
2. 使用 Dropout 假装训练许多网络
我们的模型现在可以进行概率预测,但如果我们训练了不同的模型呢?它会进行略微不同的概率预测。要成为贝叶斯,我们需要**对我们可能训练的模型进行边缘化**。为此,我们使用 Dropout。
在训练时,Dropout 通过“近似地有效地组合指数级数量的不同神经网络架构”来减少过拟合(
Srivastava 2014)。这近似于将网络权重视为要边缘化的随机变量的贝叶斯方法。通过在测试时也应用 Dropout,我们可以利用这种近似许多模型的想法来进行贝叶斯预测
(Gal 2016)。
以下是用
子类化 API 的 TF 2.0 示例
from tensorflow.keras import layers, Model
class SimpleClassifier(Model):
def __init__(self):
super(SimpleClassifier, self).__init__()
self.conv1 = layers.Conv2D(32, 3, activation='relu')
self.flatten = layers.Flatten()
self.d1 = layers.Dense(128, activation='relu')
self.dropout1 = layers.Dropout(rate=0.5)
self.d2 = layers.Dense(2, activation='softmax')
def call(self, x, training):
x = self.conv1(x)
x = self.flatten(x)
x = self.d1(x)
if training: # dropout typically applied only at train time
x = self.dropout1(x)
return self.d2(x)
打开测试时 Dropout 实际上涉及更少的代码
def call(self, x): # no ‘training’ argument required
x = self.conv1(x)
x = self.flatten(x)
x = self.d1(x)
x = self.dropout1(x) # dropout always on
return self.d2(x)
下面,你可以看到我们的贝叶斯 CNN 在起作用。每一行都是一个星系(显示在左侧)。在中间栏中,我们的 CNN 做出一个单一的概率预测(典型志愿者回答“有棒”的概率)。我们可以将其解释为一个后验,表示 k 个志愿者中有 N 个志愿者会说“有棒”的概率 - 用黑色表示。在右侧,我们使用 Dropout 对许多 CNN 进行边缘化。每个 CNN 后验(灰色)都不同,但我们可以对它们进行边缘化以获得许多 CNN 的后验(绿色) - 我们的贝叶斯后验。
|
左侧:带有或不带有棒的星系输入图像。中间:单个概率预测(即,没有 Dropout)表示多少志愿者会说“有棒”。右侧:使用不同的 Dropout 掩码进行的许多概率预测(灰色),边缘化为我们近似的贝叶斯后验(绿色)。 |
贝叶斯后验在量化每个星系是否具有棒方面做得非常出色。在
论文中阅读更多相关内容(并查看
代码)。
主动学习
现代巡天将拍摄数亿个星系的图像 - 比我们能向志愿者展示的星系多得多。鉴于这一点,我们应该用志愿者对哪些星系进行分类,用我们的贝叶斯 CNN 对哪些星系进行分类呢?
理想情况下,我们只应该向志愿者展示模型认为最具信息量的图像。模型应该能够问:“嘿,这些星系对学习非常有帮助;请你帮我标记它们好吗?”然后人类会标记它们,模型会重新训练 - 这就是主动学习。在我们的实验中,应用主动学习将达到给定性能水平所需的星系数量减少了 35-60%。
我们可以使用我们的后验来确定哪些星系信息量最大。请记住,我们使用 Dropout 来近似训练许多模型(见上文)。我们在
论文中表明,信息量大的星系是那些模型自信地不一致的星系。
为什么?我们经常在信息最少的地方持有最坚定的观点 - 我们的 CNN 也是如此(
Hendrycks 2016)。如果没有证据基础,不同的 CNN 往往会自信地不一致。
正式地,信息量大的星系是那些每个模型都自信(来自每个模型的后验中的熵 H,即 *p(votes|weights)* 很低),但所有模型的平均预测都存在不确定性(所有平均后验的熵很高)的星系。这之所以可能,是因为我们对标签进行了概率化思考,并近似地训练了许多模型。有关更多信息,请参阅 Houlsby, N. (2014) 和 Gal 2017,或查看 我们的代码以了解实现方式。
哪些星系信息量大?正是你直觉上认为信息量大的那些星系。
- 模型强烈倾向于选择多样化的特征星系而不是椭圆星系(光滑的“斑点”)。
- 对于识别棒来说,模型更倾向于选择分辨率更高的星系(红移更低)。
这种选择完全是自动的。实际上,直到我查看图像时才意识到红移越低,模型越倾向于选择!
|
我们的主动学习系统选择左侧的星系(特征化且多样化),而不是右侧的星系(光滑的“斑点”)。 |
主动学习正在挑选星系,以便现在就在星系動物園上进行标记 - 通过选择“增强”工作流程来查看它,
这里。我很兴奋地想要看看,当我们从对数十万个星系进行分类转变为对数亿个星系进行分类时,科学能够取得什么样的成就。
如果你想了解更多信息或有任何问题,请在评论区或 Twitter 上与我们联系 (
@mike_w_ai、
@chrislintott、
@yaringal、
@OATML_Oxford)。
干杯!
迈克
*Dropout 是对完全贝叶斯方法的一种不完美近似,该方法对于大型视觉模型是可行的,但可能会低估不确定性。对于小型模型,可以进行更好的近似。查看这篇文章,由 Tensorflow Probability 团队展示如何对一维回归执行此操作。