CL“信心学习”: 专注样本质量的训练,MIT与谷歌的半监督新方法,Confident learning原理与代码cleanlab

每一次挫败都值得“反复咀嚼”,人类和AI都应如此,而人类似乎从中感受更多的痛苦。也许这种痛苦源于更“高层”的“感知”。 — David 9

人类许多痛苦来源于无法躲避的事物想要躲避的“主观”(潜意识或非潜意识)。所以,懂得和“情绪”好好相处被视为“高情商”;懂得和“失败”好好相处被视为“智慧”。那么,好好和“数据”相处,恐怕也是AI模型的进步。

不得不承认,没有任何数据集是完全干净的。除去人工标注的错误,单个样本的标签也有歧义,下图是ImageNet中的噪声图像:

来自:https://arxiv.org/pdf/1911.00068.pdf

图像中的拼图(PUZZLE)上画着鼓(DRUM),那么这张图像分类应该是“拼图”还是“鼓”?超市(GROCERY STORE)内部的照片有香蕉(BANANA)的货架,那么这张图像应该归为“超市”还是“香蕉”?

同样MNIST也有难分的图像:

来自:https://github.com/cgnorthcutt/cleanlab

这些广泛存在的噪声数据,如果不和这些数据“好好相处”,任何普通的神经网络和传统算法都无可奈何(因为低级感知无法感知语义歧义)。

在不改变模型情况下,MIT和Google的研究人员试图用所谓的“信心学习”(Confident learning)方法,半监督的方式清洗数据

先看一眼整体框架: 继续阅读CL“信心学习”: 专注样本质量的训练,MIT与谷歌的半监督新方法,Confident learning原理与代码cleanlab

Tesla自动驾驶Autopilot(第2弹):多任务分布式PyTorch训练,FSD芯片,NPU,Dojo和其他

过去十年是云计算(集中式计算)流行的十年,我们不知道什么时候分布式或其他形式的“分散式计算”会“卷土重来”,但我似乎看到了“暗流涌动”。 — David 9

补充上一期我们聊到的“Tesla自动驾驶搞定多任务学习”,这次,特斯拉AI负责人Andrej Karpathy在PyTorch DEVCON 2019上进一步讨论了内部整体架构:

来自:https://www.youtube.com/watch?v=oBklltKXtDE

其中主要谈了两点:“PyTorch distributed training” 和 infrastructure 层面的一些东西。

继续上次的讨论,我们知道特斯拉autopilot自动驾驶不借助LIDAR激光而是通过八个方向的摄像头进行环境判断:

来自:https://www.youtube.com/watch?v=oBklltKXtDE

最后对模型来说要有一个top-down的俯视图做最终决策:

来自:https://www.youtube.com/watch?v=oBklltKXtDE
这就要求autopilot模型不断接受从8个摄像头捕捉到的图像,并同时输出许多output(1000个左右),而且,模型同时承载多个任务(目标检测,深度检测,目标识别等等),整个autopilot模型会包含许多个子模型(子任务):
 
来自:https://www.youtube.com/watch?v=oBklltKXtDE

事实上,上图的8个子模型其实是简化了,其实auopilot有48个子模型。上图只是象征性地展示多模型同时有很多输出。而反向传播更新时, 继续阅读Tesla自动驾驶Autopilot(第2弹):多任务分布式PyTorch训练,FSD芯片,NPU,Dojo和其他

3种用Keras和TensorFlow2.0创建模型的方法:序列模型,函数式模型和继承子类模型

David不经常聊代码,之所以单独post这篇文章,实在是这三种创建模型的方式很有代表性。市面上所有深度模型框架,在创建模型时,也不外乎这三种方式:

来自:https://www.pyimagesearch.com/2019/10/28/3-ways-to-create-a-keras-model-with-tensorflow-2-0-sequential-functional-and-model-subclassing/

第一种,序列模型。这是Keras最简单的构建模型方式(也许是所有框架中最简单构建方式),它顺序地把所有模型层依次定义,可以共享层的定义,多输入输出,但是如果要有分支,自定义层,就很困难了,下面是一个简单例子:

def shallownet_sequential(width, height, depth, classes):
  # initialize the model along with the input shape to be
  # "channels last" ordering
  model = Sequential()
  inputShape = (height, width, depth)

  # define the first (and only) CONV => RELU layer
  model.add(Conv2D(32, (3, 3), padding="same",
    input_shape=inputShape))
  model.add(Activation("relu"))

  # softmax classifier
  model.add(Flatten())
  model.add(Dense(classes))
  model.add(Activation("softmax"))

  # return the constructed network architecture
  return model

在Keras中只要模型是Sequential类,那就是使用了序列模型。

第二种,函数式模型。熟悉函数式编程的朋友对这种方式很好理解,即一切定义都是基于函数的。这种方式给了自定义层的更大空间,可更简单地定义层的分支,合并(concatenate)等继续阅读3种用Keras和TensorFlow2.0创建模型的方法:序列模型,函数式模型和继承子类模型