2018年5月7日星期一

Chrome暗藏的恐龙跳一跳,已经被AI轻松掌握了

夏乙 郭一璞 发自 凹非寺量子位 出品 | 公众号 QbitAI

什么!未连接到互联网!!

明明是联网状态,为什么我想访问的页面

无!法!打!开!

淡定。

作为一个Google Chrome浏览器的用户,当你看到上面那个页面时,不要沮丧。换个角度一想,墙内还能有更多的Play时间哦~

你有没有注意到画面里那个小恐龙?

当你遇到打不开网页的时候,只需要再点击一下这个页面(手机),或者按下空格(电脑),随着小恐龙轻轻一跳——

一个新世界开启了。

这个"恐龙跳一跳"其实是藏在Chrome浏览器里好多年的一个彩蛋。小恐龙是一只霸王龙(T-Rex)。

2013年Chrome开始用这个小恐龙的图像代替令人烦恼的404页面。2014年秋天,这只恐龙被正式改造成一个横版小游戏。以彩蛋的方式隐藏在新版Chrome浏览器里。

呐,如果你还不知道这个彩蛋,可以抓紧试一试。比方说——

  • 访问一个不翻墙就看不了的网页
  • 或者直接输入:chrome://dino
  • 或者访问:Chrome dino game (需翻墙)

后来,这个小游戏也成了不少AI练手的对象。

比如最近就有人在YouTube上贴了一段视频,展示了他如何用神经网络+遗传算法,让一个AI系统独秀于浏览器之中。

我们把精华的部分截取了一下,就是下面这段视频。

动图版:

视频版:

AI玩恐龙跑_腾讯视频

总而言之,一句话,这个AI能轻松玩到2万多分……

你能玩到几分?大概率是玩不到这个成绩的吧。毕竟在chromedino.com页面上,人类玩家的历史最高分是18842

不过,上传这段视频的作者,并没有详细公布他用的方法,当然也没有给出一个开源的地址。不过不要紧,也有别人公开分享了更多细节。

例如,GitHub上就有一个开源的代码"IAMDinosaur",同样也是利用神经网络+遗传算法,来搞定恐龙跳一跳。

地址在此:ivanseidel/IAMDinosaur

美中不足,上面这个项目也没有配上太详尽的解读。然而好消息是,最近有个国外的小哥Ravi Munde,列了一份非常详尽的教程。

这个教程用的方法是强化学习中的Q-learning,比较适合入门练手,而且对硬件的要求不高。

量子位搬运这份教程如下。

Q-learning了解/复习一下

对动物来说,强化学习的能力是与生俱来的。拿儿童学步来举例,如果小朋友努力的迈出第一步,就会获得父母的鼓励——可能是鼓掌叫好,也可能是一块糖;但如果小朋友坚决不肯学习走路,那父母就不会给它糖吃了。强化学习就是依照这类激励行为而设置的。

而在这个游戏中,对我们的AI小恐龙来说,强化学习需要让他在无监督的情况下,先认识到做出不同动作的结果,并且以获得高分为最高激励。

Ravi Munde用Q-learning模拟了一个特殊函数,这个函数驱动AI在不同状况下做出正确的选择。

Q-learning是强化学习的一种无模型实现,根据Q值对每个状态进行判断此时如果采取行动,能获得怎样的奖励。一个样本Q表让我们了解数据的结构。在恐龙跑酷游戏中,状态是当前的游戏截图,能采取的行动是跳或不跳[0,1]

Ravi Munde决定用深度神经网络来决定小恐龙何时起跳,而且要在最简单的强化学习实现基础上,引入不同参数来辅助它。

缺乏已标记的数据让强化学习非常不稳定。为了获得适用于这个游戏的数据,Munde小哥决定,先让小恐龙自己瞎跳几千次,把每个动作的反馈记下来,然后从数据中随机挑选一些来训练模型。

但之后,Munde小哥发现,他训练了一个倔强的模型——模型坚定的认为,跳,一定比不跳好。所以,为了让模型在训练时能在跳与不跳之间多尝试一下,他引入了一个函数ɛ来决定行动的随机性,然后再逐渐减小它的值来削减随机性,最终让模型去选择最有可能获得奖励的行动。

赞誉分布(Credit Assignment)问题可能会让模型陷入混乱——目前获得的奖励究竟来自于过去的哪个行为呢?在恐龙跑酷游戏中,小恐龙跳到半空中后无法再次跳跃,但模型可能会在恐龙处于半空中时发出跳跃指令,这种情况就让恐龙非常容易砸到仙人掌上。

在这种情况下,"砸到仙人掌上"这个负反馈实际上是此前上一次做出跳跃决定的结果,而不是刚刚恐龙在半空中时做出的跳跃结果所导致的。

在面临这种问题的情况下,可以引入贴现因子(Discount Factor)γ来决定模型做出动作时看得多远。γ间接解决了赞誉分布问题,在这个游戏中,当γ=0.99时,模型认识到在无障碍时随便跳会导致真的遇到障碍时自己正在半空中,无法继续跳跃。

除了这两个参数之外,后面就几乎不需要任何参数了。

#game parameters GAMMA = 0.99 # decay rate of past observations original 0.99 OBSERVATION = 50000. # timesteps to observe before training EXPLORE = 100000 # frames over which to anneal epsilon FINAL_EPSILON = 0.0001 # final value of epsilon INITIAL_EPSILON = 0.1 # starting value of epsilon REPLAY_MEMORY = 50000 # number of previous transitions to remember BATCH = 32 # size of minibatch FRAME_PER_ACTION = 1

你需要准备的是

  • Python 3.6
  • Selenium
  • OpenCV
  • PIL
  • Chromium driver for Selenium
  • Keras

略微解释一下这几个工具。

构建这个AI模型,需要用Python编程。而游戏是用JavaScript写成的。所以,得借助一些工具才能更好地沟通。

Selenium是一种流行的浏览器自动化工具,用于向浏览器发送操作指令,以及获取各种游戏参数。

接口的事情搞定了,还得想办法获得游戏截屏。用Selenium也行,但是速度很慢,截屏和处理一次大约得1秒钟。

用PIL和OpenCV能够更好地完成截屏和图像预处理,可以达到5fps的帧率。你可能觉得还是慢,但已经足够对付这个游戏了。

游戏模块

下面这个模块,实现了Python和浏览器(使用Selenium)的沟通。

''' * Game class: Selenium interfacing between the python and browser * __init__(): Launch the broswer window using the attributes in chrome_options * get_crashed() : return true if the agent as crashed on an obstacles. Gets javascript variable from game decribing the state * get_playing(): true if game in progress, false is crashed or paused * restart() : sends a signal to browser-javascript to restart the game * press_up(): sends a single to press up get to the browser * get_score(): gets current game score from javascript variables. * pause(): pause the game * resume(): resume a paused game if not crashed * end(): close the browser and end the game ''' class Game:   def __init__(self,custom_config=True):     chrome_options = Options()     chrome_options.add_argument("disable-infobars")     self._driver = webdriver.Chrome(executable_path = chrome_driver_path,chrome_options=chrome_options)     self._driver.set_window_position(x=-10,y=0)     self._driver.set_window_size(200, 300)     self._driver.get(os.path.abspath(game_url))     #modifying game before training     if custom_config:       self._driver.execute_script("Runner.config.ACCELERATION=0")   def get_crashed(self):     return self._driver.execute_script("return Runner.instance_.crashed")   def get_playing(self):     return self._driver.execute_script("return Runner.instance_.playing")   def restart(self):     self._driver.execute_script("Runner.instance_.restart()")      time.sleep(0.25)# no actions are possible              # for 0.25 sec after game starts,              # skip learning at this time and make the model wait   def press_up(self):     self._driver.find_element_by_tag_name("body").send_keys(Keys.ARROW_UP)   def get_score(self):     score_array = self._driver.execute_script("return Runner.instance_.distanceMeter.digits")     score = ''.join(score_array) # the javascript object is of type array with score in the formate[1,0,0] which is 100.     return int(score)   def pause(self):     return self._driver.execute_script("return Runner.instance_.stop()")   def resume(self):     return self._driver.execute_script("return Runner.instance_.play()")   def end(self):     self._driver.close()

恐龙智能体模块

这个模块在游戏模块的帮助下,用于控制小恐龙的动作。

class DinoAgent:   def __init__(self,game): #takes game as input for taking actions     self._game = game;      self.jump(); #to start the game, we need to jump once     time.sleep(.5) # no action can be performed for the first time when game starts   def is_running(self):     return self._game.get_playing()   def is_crashed(self):     return self._game.get_crashed()   def jump(self):     self._game.press_up()   def duck(self):     self._game.press_down()

游戏状态模块

神经网络直接使用这个模块,来执行操作并获取新的状态。

''' get_state(): accepts an array of actions,         performs the action on the agent  returns : new state, reward and if the game ended. ''' class Game_sate:   def __init__(self,agent,game):     self._agent = agent     self._game = game   def get_state(self,actions):     score = self._game.get_score()      reward = 0.1*score/10 # dynamic reward calculation     is_over = False #game over     if actions[1] == 1: #else do nothing       self._agent.jump()       reward = 0.1*score/11     image = grab_screen()       if self._agent.is_crashed():       self._game.restart()       reward = -11/score       is_over = True     return image, reward, is_over #return the Experience tuple

预处理

游戏修改

原始的游戏相对复杂,比如游戏速度会逐渐加快,障碍物会改变,还会出现云朵、星星、地面纹理等。一次同时学习这么多东西会消耗大量时间,甚至在训练过程中引入不必要的噪音。

为此作者修改了游戏的源代码、简化局面,去除了一些视觉元素(云、历史最佳成绩等),还有让恐龙的奔跑速度保持不变。

图像处理

原始截图的分辨率为1200×300,包含三个通道。作者计划使用4个连续的屏幕截图作为模型的单一输入,也就是1200×300×3×4。

问题是,这个小哥只有一个i7的CPU可用,所以他的电脑没办法在处理这个尺寸输入的同时玩游戏。所以,还得继续用OpenCV的库调正截图大小、裁剪等。最终输入图像大小为40×20像素,单通道,并用Canny突出显示边缘。

def grab_screen(_driver = None):   #bbox = region of interest on the entire screen   screen = np.array(ImageGrab.grab(bbox=(40,180,440,400)))    image = process_img(screen)#processing image as required   return image  def process_img(image):   #game is already in grey scale canvas, canny to get only edges and reduce unwanted objects(clouds)   # resale image dimensions   image = cv2.resize(image, (0,0), fx = 0.15, fy = 0.10)    #crop out the dino agent from the frame   image = image[2:38,10:50] #img[y:y+h, x:x+w]    image = cv2.Canny(image, threshold1 = 100, threshold2 = 200) #apply the canny edge detection   return image

然后,堆叠4张图创建单个输入,也就是:40×20×4。请注意,这里小恐龙也裁减掉了,因为整个学习过程,只需要知道障碍物和与边缘的距离即可。

模型架构

现在输入有了,用模型输出来玩游戏的方法也有了,只差模型架构。

小哥选择把3个卷积层压平,连接到一个512神经元的全连接层(dense layer)上。池化层直接被砍掉了,这个东西在图像分类问题上很有用,但是玩Dino的时候神经网络只需要知道障碍物的位置,池化层就起不了什么作用了。

这个模型的输出,形状和可能的操作数量一样。模型会预测各种操作的Q值,也叫discounted future reward,然后我们选数值最高的那个。

下面这段代码,就能召唤一个用TensorFlow后端的Keras来搭建的模型:

#model hyper parameters LEARNING_RATE = 1e-4 img_rows , img_cols = 40,20 img_channels = 4 #We stack 4 frames ACTIONS = 2 def buildmodel():   print("Now we build the model")   model = Sequential()   model.add(Conv2D(32, (8, 8), strides=(4, 4), padding='same',input_shape=(img_cols,img_rows,img_channels))) #20*40*4   model.add(Activation('relu'))   model.add(Conv2D(64, (4, 4), strides=(2, 2), padding='same'))   model.add(Activation('relu'))   model.add(Conv2D(64, (3, 3), strides=(1, 1), padding='same'))   model.add(Activation('relu'))   model.add(Flatten())   model.add(Dense(512))   model.add(Activation('relu'))   model.add(Dense(ACTIONS))   adam = Adam(lr=LEARNING_RATE)   model.compile(loss='mse',optimizer=adam)   print("We finish building the model")   return model

开始训练

接下来,就是见证奇迹的时刻~~

也就是用一段代码来训练模型,这段代码的任务是:

  • 从无操作开始,得到初始状态initial state(s_t)
  • 观察玩游戏的过程,代码中的OBSERVATION表示步数
  • 预测一个操作的效果
  • 在Replay Memory中存储经验
  • 训练阶段,从Replay Memory里随机选择一组,用它来训练模型
  • 如果game over了,就重开一局

更详细的,可以看这段自带注释的代码:

'''  Parameters: * model => Keras Model to be trained * game_state => Game State module with access to game environment and dino * observe => flag to indicate wherther the model is to be trained(weight updates), else just play ''' def trainNetwork(model,game_state):   # store the previous observations in replay memory   D = deque() #load from file system   # get the first state by doing nothing   do_nothing = np.zeros(ACTIONS)   do_nothing[0] =1 #0 => do nothing,            #1=> jump    x_t, r_0, terminal = game_state.get_state(do_nothing) # get next step after performing the action   s_t = np.stack((x_t, x_t, x_t, x_t), axis=2).reshape(1,20,40,4) # stack 4 images to create placeholder input reshaped 1*20*40*4     OBSERVE = OBSERVATION   epsilon = INITIAL_EPSILON   t = 0   while (True): 

2018年5月6日星期日

一起读懂传说中的经典:受限玻尔兹曼机

尽管性能没有流行的生成模型好,但受限玻尔兹曼机还是很多读者都希望了解的内容。这不仅是因为深度学习的复兴很大程度上是以它为前锋,同时它那种逐层训练与重构的思想也非常有意思。本文介绍了什么是受限玻尔兹曼机,以及它的基本原理,并以非常简单的语言描述了它的训练过程。虽然本文不能给出具体的实现,但这些基本概念还是很有意思的。

定义 & 结构

受限玻尔兹曼机(RBM,Restricted Boltzmann machine)由多伦多大学的 Geoff Hinton 等人提出,它是一种可以用于降维、分类、回归、协同过滤、特征学习以及主题建模的算法。更多关于如何部署诸如 RBM 这样的神经网络的具体例子,请参阅 deeplearning4j 关于深度学习用例的内容。

本文将从受限玻尔兹曼机的关系和历史重要性出发,首先讨论什么是 RBM。随后,我们会使用图表和浅显的语言来描述它们的运行原理。

RBM 是两层神经网络,这些浅层神经网络是 DBN(深度信念网络)的构建块。RBM 的第一层被称为可见层或者输入层,它的第二层叫做隐藏层。

上图中的每个圆圈代表一个类似于神经元的节点,这些节点通常是产生计算的地方。相邻层之间是相连的,但是同层之间的节点是不相连的。

也就是说,不存在层内通信,这就是 RBM 中的限制所在。每一个节点都是处理输入数据的单元,每个节点通过随机决定是否传递输入。随机意味着「随机判断」,这里修改输入的参数都是随机初始化的。

每个输入单元以数据集样本中的低级特征作为输入。例如,对于一个由灰度图组成的数据集,每个输入节点都会接收图像中的一个像素值。MNIST 数据集有 784 个像素点,所以处理它们的神经网络必须有 784 个输入节点。

现在让我们跟随单像素穿过这两层网络。在隐藏层的节点 1,x 和一个权重相乘,然后再加上一个偏置项。这两个运算的结果可作为非线性激活函数的输入,在给定输入 x 时激活函数能给出这个节点的输出,或者信号通过它之后的强度。这里其实和我们常见的神经网络是一样的过程。

activation f((weight w * input x) + bias b ) = output a


接下来,让我们看一下多个输入单元是如何结合在一个隐藏节点的。每个 x 乘以一个独立的权重,然后相加后再加一个偏置项,最后将结果传递到激活函数来产生输出。

因为所有可见(或输入)节点的输入都被传递到所有的隐藏节点了,所以 RBM 可以被定义为对称二分图(symmetrical bipartite graph)。

对称意味着每个可见节点都与一个隐藏节点相连(如下所示)。二分则意味着它具有两部分,或者两层。图是一个数学术语,指的是由节点和边组成的网络。

在每一个隐藏节点,每个输入 x 都与对应的权重 w 相乘。也就是说,一个输入 x 会拥有 12 个权重(4 个输入节点×3 个输出节点)。两层之间的权重总会形成一个矩阵,矩阵的行数等于输入节点的个数,列数等于输出节点的个数。

每个隐藏节点会接收 4 个与对应权重相乘的输入。这些乘积的和再一次与偏置相加,并将结果馈送到激活函数中以作为隐藏单元的输出。

如果这两层是更深网络的一部分,那么第一个隐藏层的输出会被传递到第二个隐藏层作为输入,从这里开始就可以有很多隐藏层,直到它们增加到最终的分类层。对于简单的前馈网络,RBM 节点起着自编码器的作用,除此之外,别无其它。

重建(Reconstruction)

但是在本文关于 RBM 的介绍中,我们会集中讨论它们如何以一种无监督的方式通过自身来重建数据,这使得在不涉及更深层网络的情况下,可见层和第一个隐藏层之间会存在数次前向和反向传播。

在重建阶段,第一个隐藏层的激活状态变成了反向传递过程中的输入。它们与每个连接边相同的权重相乘,就像 x 在前向传递的过程中随着权重调节一样。这些乘积的和在每个可见节点处又与可见层的偏置项相加,这些运算的输出就是一次重建,也就是对原始输入的一个逼近。这可以通过下图表达:

因为 RBM 的权重是随机初始化的,所以,重建结果和原始输入的差距通常会比较大。你可以将 r 和输入值之间的差值看做重建误差,然后这个误差会沿着 RBM 的权重反向传播,以一个迭代学习的过程不断反向传播,直到达到某个误差最小值。

关于反向传播的更全面的解释请查看机器之心的文章:反向传播为何饱受质疑?(附完整的 BP 推导)

正如你所看到的,在前向传递过程中,给定权重的情况下 RBM 会使用输入来预测节点的激活值,或者输出的概率 x:p(a|x; w)。

但是在反向传播的过程中,当激活值作为输入并输出原始数据的重建或者预测时,RBM 尝试在给定激活值 a 的情况下估计输入 x 的概率,它具有与前向传递过程中相同的权重参数。这第二个阶段可以被表达为 p(x|a; w)。

这两个概率估计将共同得到关于输入 x 和激活值 a 的联合概率分布,或者 p(x, a)。重建与回归有所不同,也不同于分类。回归基于很多输入来估计一个连续值,分类预测出离散的标签以应用在给定的输入样本上,而重建是在预测原始输入的概率分布。

这种重建被称之为生成学习,它必须跟由分类器执行的判别学习区分开来。判别学习将输入映射到标签上,有效地在数据点与样本之间绘制条件概率。若假设 RBM 的输入数据和重建结果是不同形状的正态曲线,它们只有部分重叠。

为了衡量输入数据的预测概率分布和真实分布之间的距离,RBM 使用 KL 散度来度量两个分布的相似性。KL 散度测量的是两条曲线的非重叠区域或者说发散区域,RBM 的优化算法尝试最小化这些区域,所以当共享权重与第一个隐藏层的激活值相乘时就可以得出原始输入的近似。图的左边是一组输入的概率分布 p 及其重构分布 q,图的右侧是它们的差的积分。


迭代地根据它们产生的误差来调节权重,RBM 学会了逼近原始数据。你可以说权重在慢慢地反映输入数据的结构,并通过隐藏层的激活值进行编码,学习过程就像两个概率分布在逐步重合。

概率分布

让我们来讨论一下概率分布。如果你在掷两个骰子,所有结果的概率分布如下:

也就是说,和为 7 的结果是最有可能出现的,因为相比于 2 到 12 等其它结果,有更多的抛掷组合可以得到 7 这个结果(3+4,1+6,2+5)。

或者举另一个例子:语言是字母的特定概率分布,因为每一种语言会使用一些字母较多,而另一些较少。在英语中,字母 e、t 以及 a 是最常见的,然而在冰岛语中,最常见的字母是 a、t 和 n。因此尝试使用基于英语的权重集合来重建冰岛语将会导致较大的差异。

同样,图像数据集拥有像素值的唯一概率分布,这取决于数据集中图像的种类。像素值的分布取决于数据集中的图像类别,例如 MNIST:

或者 Faces in the Wild 数据集中标记的头像:

想象一下仅输入狗和大象图片的 RBM,它只有两个输出节点,每个结点对应一种动物。在前向传递的过程中 RBM 会问自己这样的问题:在给定的这些像素下,我应该向哪个节点发送更强的信号呢,大象节点还是狗的节点?在反向传递的过程中 RBM 的问题是:给定一头大象的时候,应该期望那种像素分布?

那就是联合概率分布:给定 a 时 x 的概率以及给定 x 时 a 的概率,可以根据 RBM 两层之间的共享权重而确定。

从某种意义上而言,学习重建的过程就是学习在给定的图像集合下,哪些像素会倾向于同时出现。由深层网络的隐藏层节点所产生的激活状态表现出来的共现现象:例如,「非线性灰色管+大的、松软的耳朵+皱纹」可以作为一个分布。

在上面的两幅图像中,你看到了用 Deeplearning4j 实现的 RBM。这些重建代表着 RBM 的激活值所「认为」输入数据看起来的样子,Geoff Hinton 将其称为机器「做梦」。当被呈现在神经网络在训练过程时,这种可视化是非常有用的启发,它让人确信 RBM 确实在学习。如果不是,那么它的超参数应该被调整。

最后一点:你会注意到 RBM 有两个偏置项。这是有别于其它自动编码器的一个方面。隐藏层的偏置项有助于 RBM 在前向传递中获得非零激活值,而可见层的偏置有助于 RBM 学习后向传递中的重建。

多层受限玻尔兹曼机

一旦 RBM 学到了与第一隐藏层激活值有关的输入数据的结构,那么数据就会沿着网络向下传递一层。你的第一个隐藏层就成为了新的可见层或输入层。这一层的激活值会和第二个隐藏层的权重相乘,以产生另一组的激活。

这种通过特征分组创建激活值集合序列,并对特征组进行分组的过程是特征层次结构的基础,通过这个过程,神经网络学到了更复杂的、更抽象的数据表征。

对于每一个新的隐藏层,权重都会通过迭代反复调整,直至该层能够逼近来自于前一层的输入。这是贪婪的、逐层的、无监督的预训练。它不需要使用标签来改善网络的权重,这意味着我们可以在无标签的数据集上进行训练,而这些数据没有经过人工处理,这是现实中绝大多数的数据。通常,拥有更多数据的算法会产生更准确的结果,这也是深层学习算法崛起的原因之一。

因为这些权重早已接近数据的特征,所以在使用深度信念网络进行图像分类的时候,后续的监督学习阶段可以更简单地学习。尽管 RBM 有很多用途,但合适的权重初始化以方便以后的分类是其主要优点之一。从某种程度而言,它们完成了某种类似于反向传播的功能:它们很好地调整了权重,以对数据进行更好的建模。你可以说预训练和反向传播是达到相同目的的可替代方法。

为了在一个图中展示受限玻尔兹曼机,我们需要使用对称二分双向图表示:

对于那些对深入研究 RBM 结构感兴趣的人而言,它们是一种无向图模型,也被称作马尔科夫随机场。

代码实例:Stacked RBMS

GitHub 链接:

https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/unsupervised/deepbelief/DeepAutoEncoderExample.java

参数 & K

变量 k 是运行对比散度(Contrastive Divergence)的次数。对比散度是用来计算梯度(该斜率表示网络权重与其误差之间的关系)的方法,没有这种方法,学习就无法进行。

在上面的例子中,你可以看到如何将 RBM 创建为具有更通用多层配置的层。在每个点处,你会发现一个可以影响深度神经网络结构和性能的额外参数。大多数这些参数都是在这里定义的。

参数初始化(weightInit 或者 weightInitialization)表示放大或者抑制到达每个节点的输入信号的系数的初始值。合适的权重初始化可以节省大量的训练时间,因为训练一个网络只不过是调整系数来传递最佳信号,从而使网络能够准确分类。

激活函数(activationFunction)是一组函数中的一个,用于确定每个节点处的激活阈值,高于阈值的信号可以通过,低于阈值的信号就被阻止。如果一个节点传递了一个信号,则它被「激活」。

优化算法(optimizationAlgo)指神经网络最小化误差或者找到最小误差轨迹的方式,它是一步一步调整参数的。LBFGS 是一种优化算法,它利用二阶导数来计算梯度的斜率,系数将沿着梯度的斜率进行调整。

正则化(regularization)方法(如 L2)有助于防止神经网络中的过拟合。正则化本质上会惩罚较大的系数,因为大系数意味着网络已经学会将结果锁定在几个高权值的输入上了。过强的权重会使网络模型在面对新数据的时候难以泛化。

显元/隐元(VisibleUnit/HiddenUnit)指神经网络的层。显元或者可见层,是输入到达的层,隐元或者隐藏层,是输入被结合成更复杂特征的层。这两种单元都有各自所谓的变换,在这里,可见层是高斯变换,隐藏层是整流线性单元,它们将来自它们对应层的信号映射到新的空间。

损失函数(lossFunction)是测量误差的方法,或者测量网络预测和测试集包含的正确的标签之间差距的方法。我们在这里使用的是 SQUARED_ERROR,它使所有的误差都是正值,因此可以被求和并反向传播。

学习率(learningRate,如 momentum)会影响神经网络在每次迭代中校正误差时调整系数的程度。这两个参数有助于确定网络将梯度降低到局部最优时的步长。较大的学习率会使网络学习得更快,并且可能越过最佳值。较小的学习率可能减慢学习,而且可能是低效的。

连续 RBM

连续 RBM 是受限玻尔兹曼机的一种形式,它通过不同类型的对比散度采样接受连续的输入(也就是比整数切割得更细的数字)。这允许 CRBM 处理图像像素或字数向量这类被归一化到 0 到 1 之间的小数的向量。

应该注意,深度学习网络的每一层都需要四个元素:输入、系数、偏置项以及变换(激活算法)。

输入是数值数据,是一个来自于前面层(或者原始数据)的向量。系数是通过每个节点层的特征的权重。偏置项确保部分节点无论如何都能够被激活。变换是一种额外的算法,它在数据通过每一层以后以一种使梯度(梯度是网络必须学习的)更容易被计算的方式压缩数据。

这些额外算法和它们的组合可以逐层变化。

一种有效的连续 RBM 在可见(或者输入)层上使用高斯变换,在隐藏层上使用整流线性单元(ReLU)变换。这在面部重建中特别有用。对于处理二进制数据的 RBM 而言,只需要进行二进制转换即可。

高斯变换在 RBM 的隐藏层上的表现不好。相反,使用 ReLU 变换能够表示比二进制变换更多的特征,我们在深度置信网络中使用了它。

总结 & 下一步工作

你可以将 RBM 的输出解释为百分比。每次重建的数字不为零,这是 RBM 学习输入的良好指示。

应当指出的是,RBM 并不能生成所有的浅层前馈网络中最稳定、最一致的结果。在很多情况下,密集层自编码器性能较好。事实上,业界正在转向变分自编码器和 GAN 等工具。

下一步,我们将会展示如何实现深度置信网络(https://deeplearning4j.org/deepbeliefnetwork.html),它由许多受限玻尔兹曼机堆叠而成。

原文链接:https://deeplearning4j.org/restrictedboltzmannmachine.html#params

]]> 原文: https://ift.tt/2wkxdj1
RSS Feed

机器知心

IFTTT

华盛顿大学成立SAML实验室:陈天奇参与,探索跨系统堆栈的多层次问题

安妮 发自 凹非寺量子位 出品 | 公众号 QbitAI

昨天,TVM、XGBoost、cxxnet等机器学习工具的作者陈天奇宣布,自己所在的华盛顿大学新成立了一个实验室,组织代号"SAML"。

陈天奇本人在微博上介绍说,实验室将有整合系统、体系结构、机器学习和程序语言4个方向的团队推进深度学习算法、系统的硬件和协同设计研究和TVM等开源项目。

四个方向

华盛顿大学为什么想建立这个实验室?在SAML项目首页上,我们找到了答案。

我们想解决调度、网络、存储和编程抽象方面的新挑战,构建可从新兴硬件体系中受益的可扩展系统,处理不断增长的可用数据。重要的是,未来的模型和算法需要与硬件共同设计,系统级的要素需要告知硬件软件栈的设计。我们需要建立通用、可复用的基础设施,并制造更智能的系统。目前,这些挑战和研究问题涉及计算机科学的多个领域。

因此,SAML问世。

简单说来,这是一个跨学科的机器学习研究小组,探索跨系统堆栈的多层次问题,包括深度学习框架、训练和推理的专用硬件、新的中间表示、可微编程和各种应用程序。

目前,实验室有四个研究方向。

一个方向是序列模型的专门化(Sequential Model Specialization),能通过自适应级联的深度模型为视频快速分类。

研究人员提出了一种级联的廉价分类器架构,并证明了当种类分布高度倾向于小型类集合时,这种专门化的模型准确率相对较高。

PHub项目是第二个方向,研究内容包括用于高效分布式深度神经网络训练的参数服务器。

这项研究以华盛顿大学和微软研究院的论文Parameter Hub: High Performance Parameter Servers for Efficient Distributed Deep Neural Network Training为基础,探索参数服务器的平衡设计。

论文地址:

https://ift.tt/2rqShP5

第三个方向以陈天奇团队的TVM堆栈为基础,研究适用于深度学习的端对端优化堆栈。

去年8月,当陈天奇发布TVM时曾引起业内讨论的高潮,通俗点来说,这是一种把深度学习模型分发到各种各样硬件设备上的、端对端的解决方案,包含以下组件:

相关论文地址:

https://ift.tt/2BvyW6g

最后一个项目也与陈天奇有关,XGBoost项目是一个高效灵活的可扩展的树状增强系统,在梯度增强的框架下实现了机器学习算法。

相关论文地址:

https://ift.tt/2bHwZVX

参与团队

目前,项目的参与者均来自华盛顿大学,并由Sampa、Syslab、MODE和PLSE实验室的教师、研究生和本科生组成。

最后,附项目主页地址~

https://ift.tt/2HUvaHV

欢迎大家关注我们的专栏:量子位 - 知乎专栏

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复"招聘"两个字。

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态



via 量子位 - 知乎专栏 https://ift.tt/2rlgsi2
RSS Feed

RSS5

IFTTT

华盛顿大学成立SAML实验室:陈天奇参与,探索跨系统堆栈的多层次问题

安妮 发自 凹非寺量子位 出品 | 公众号 QbitAI

昨天,TVM、XGBoost、cxxnet等机器学习工具的作者陈天奇宣布,自己所在的华盛顿大学新成立了一个实验室,组织代号"SAML"。

陈天奇本人在微博上介绍说,实验室将有整合系统、体系结构、机器学习和程序语言4个方向的团队推进深度学习算法、系统的硬件和协同设计研究和TVM等开源项目。

四个方向

华盛顿大学为什么想建立这个实验室?在SAML项目首页上,我们找到了答案。

我们想解决调度、网络、存储和编程抽象方面的新挑战,构建可从新兴硬件体系中受益的可扩展系统,处理不断增长的可用数据。重要的是,未来的模型和算法需要与硬件共同设计,系统级的要素需要告知硬件软件栈的设计。我们需要建立通用、可复用的基础设施,并制造更智能的系统。目前,这些挑战和研究问题涉及计算机科学的多个领域。

因此,SAML问世。

简单说来,这是一个跨学科的机器学习研究小组,探索跨系统堆栈的多层次问题,包括深度学习框架、训练和推理的专用硬件、新的中间表示、可微编程和各种应用程序。

目前,实验室有四个研究方向。

一个方向是序列模型的专门化(Sequential Model Specialization),能通过自适应级联的深度模型为视频快速分类。

研究人员提出了一种级联的廉价分类器架构,并证明了当种类分布高度倾向于小型类集合时,这种专门化的模型准确率相对较高。

PHub项目是第二个方向,研究内容包括用于高效分布式深度神经网络训练的参数服务器。

这项研究以华盛顿大学和微软研究院的论文Parameter Hub: High Performance Parameter Servers for Efficient Distributed Deep Neural Network Training为基础,探索参数服务器的平衡设计。

论文地址:

https://ift.tt/2rqShP5

第三个方向以陈天奇团队的TVM堆栈为基础,研究适用于深度学习的端对端优化堆栈。

去年8月,当陈天奇发布TVM时曾引起业内讨论的高潮,通俗点来说,这是一种把深度学习模型分发到各种各样硬件设备上的、端对端的解决方案,包含以下组件:

相关论文地址:

https://ift.tt/2BvyW6g

最后一个项目也与陈天奇有关,XGBoost项目是一个高效灵活的可扩展的树状增强系统,在梯度增强的框架下实现了机器学习算法。

相关论文地址:

https://ift.tt/2bHwZVX

参与团队

目前,项目的参与者均来自华盛顿大学,并由Sampa、Syslab、MODE和PLSE实验室的教师、研究生和本科生组成。

最后,附项目主页地址~

https://ift.tt/2HUvaHV

欢迎大家关注我们的专栏:量子位 - 知乎专栏

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复"招聘"两个字。

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态



via 量子位 - 知乎专栏 https://ift.tt/2rlgsi2
RSS Feed

RSS5

IFTTT

M2 模型杀回 Coding 和 Agent 领域,MiniMax 想要「普惠智能」-InfoQ每周精要No.900

「每周精要」 NO. 900 2025/11/01 头条 HEADLINE M2 模型杀回 Coding 和 Agent 领域,MiniMax 想要「普惠智能」 精选 SELECTED a16z 将 3000 万开发者标价 3 万亿 网友:几个初创公司 + 大模型就...