无导师学习抽取样本集合中蕴含的统计特性,并以神经元之间的联接权的形式存于网络中。Hebb学习规则是一种经典的无导师学习算法。
Hebb学习规则
Hebb算法核心思想是,当两个神经元同时处于激发状态时两者间的连接权会被加强,否则被减弱。
为了理解Hebb算法,有必要简单介绍一下条件反射实验。巴甫洛夫的条件反射实验:每次给狗喂食前都先响铃,时间一长,狗就会将铃声和食物联系起来。以后如果响铃但是不给食物,狗也会流口水。
受该实验的启发,Hebb的理论认为在同一时间被激发的神经元间的联系会被强化。比如,铃声响时一个神经元被激发,在同一时间食物的出现会激发附近的另一个神经元,那么这两个神经元间的联系就会强化,从而记住这两个事物之间存在着联系。相反,如果两个神经元总是不能同步激发,那么它们间的联系将会越来越弱。
Hebb学习规则可表示为:
其中Wij表示神经元j到神经元i的连接权,yi与yj表示两个神经元的输出,a是表示学习速率的常数,如果yi与yj同时被激活,即yi与yj同时为正,那么wij将增大。如果yi被激活,而yj处于抑制状态,即yi为正yj为负,那么wij将变小。
基于 Hebb 学习规则的方法——自联想存储器
鸡尾酒会问题是人工智能领域中最有趣也是最有挑战性的问题之一。这是因为在酒会中,我们需要在众多的说话者中将注意力集中在某个说话者身上,且要随时在多个说话者之间切换注意力。人脑能够很好地解决这个问题,目前已有很多种尝试在机器中模拟这种能力的方法。
自联想存储器是当一个已存储序列的片段,或者加上噪音的版本再次出现时,能够回忆起该序列原貌的存储器。它能够有效地降低输入的噪音,或移除输入中的其他干扰。
下图描述了自联想存储器的最简单的版本,所有的输入与输出为全连接的单层前向网络结构
基于 hebb 规则,该网络中的权值 wijwij 的调整会根据以下规则进行调整:
在训练阶段,自联想存储器的任务是学习模式对 {0,0},{1,1},{2,2},{3,3}的匹配。
学习规则:
在测试阶段,我们会对这些数字加了遮挡或是噪声之后作为输入。
使用训练阶段学习到的 w 权值矩阵,并且由于为控制输出结果向量值为 0 或 1 ,我们采用硬限幅输函数作为激发函数:
因此测试阶段的输出为:
下面以图像"0"的记忆和修复做试验:
# coding = utf-8
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import os
#========================================================
# 数据预处理
#========================================================
def transform(img):
'''
将图像转为一维向量
'''
result = np.int_(img.reshape((-1,1)))
length = len(result)
# 为便于分类训练色像素点对应的分量值置黑色为-1,其他置为1
for i in range(length):
if int(result[i]) < 255:
result[i] = -1
else:
result[i] = 1
print(result)
return result
#========================================================
# 训练阶段
#========================================================
def training(W, img, lr):
'''
训练函数
INPUT --> 权值, 图像, 学习率
'''
p = transform(img)
pLen = len(p)
# 初始化权值矩阵W全0矩阵
if W is None:
W = np.zeros((pLen,pLen))
t = p
# 实现训练阶段基于hebb规则的学习过程
# 使用np.dot()函数实现向量的内积运算
result = W + lr * np.dot(p,t.T)
return result
#========================================================
# 测试阶段
#========================================================
def hardlim(a):
'''
hardlim硬限传输激发函数
当网络的输入达到阈值时,则硬限幅激活函数的输出为1,否则为0
'''
a[a >= 0] = 1
a[a < 0] = 0
return a
def testing(W, img):
'''
测试函数
'''
# 调用激发函数hardlim控制输出结果为0或1
result = hardlim(np.dot(transform(img).T, W))
return result
#========================================================
# 主程序
#========================================================
if __name__=='__main__':
# 调用训练函数进行自联想存储器的训练
W = None
img_train = np.array(Image.open('0.bmp').convert("L"))
lr = 0.5
W = training(W, img_train, lr)
# 利用训练得到的权值矩阵进行测试
test_old = np.array(Image.open('0_test.bmp').convert("L"))
test_new = testing(W, test_old).reshape(img_train.shape)
plt.figure(figsize=(10,10))
plt.subplot(121)
# 打印待修复图像
plt.title('old')
plt.imshow(test_old, cmap=plt.cm.gray)
plt.subplot(122)
# 打印修复后图像
plt.title('new')
plt.imshow(test_new, cmap=plt.cm.gray)
plt.show()
网友评论