深度学习(三):通用梯度下降(一次学习多个权重)

1 多输入梯度下降学习

1、梯度下降也适用于多输入。因为例子中,三个权重共享一个输出节点,它们也共享一个 delta。但是由于 input 不同,不同的权重对应不同的 weight_delta(权重增量)


#1空白神经网络
def w_sum(a,b):
    assert (len(a) == len(b))
    output = 0
    for i in range(len(a)):
        output += (a[i] * b[i])
    return output

weights = [0.1,0.2,-0.1]

def neural_network(input,weights):
    pred = w_sum(input,weights)
    return pred

#2做出预测,计算误差和增量
toes = [8.5,9.5,9.9,9.0]
wlrec = [0.65,0.8,0.8,0.9]
nfans = [1.2,1.3,0.5,1.0]

win_or_lose_binary = [1,1,0,1]
true = win_or_lose_binary[0]

#3计算权重增量
def ele_mul(number,vector):
    output = [0,0,0]
    assert(len(output) == len(vector))
    for i in range(len(vector)):
        output[i] += number * vector[i]
    return output

input = [toes[0],wlrec[0],nfans[0]]

pred = neural_network(input,weights)

error = (pred - true)**2

delta = pred - true

weight_deltas = ele_mul(delta,input)#三个权重共享一个输出节点,所以它们共享一个delta

#4更新权重
alpha = 0.01

for i in range(len(weights)):
    weights[i] -= weight_deltas[i] * alpha

pred = neural_network(input,weights)

print("Weights:" + str(weights))
print("Weight_delta:" + str(weight_deltas))
print("pred:" + str(pred))


2、可以画出三条独立的误差/权重曲线,每条曲线对应一个权重。曲线的斜率反应了 weight_delta 的值。由于 a 的 input 值更大,所以 a 的weight_delta 更陡峭

3、大部分的学习(权重改变)都是在输入值最大的权重项上进行的,因为能够显著的改变斜率。基于斜率的差异,需要将 alpha 设置的比较低。如果 alpha 设置的比较高(上面的代码 alpha 由 0.01 变更为0.1),也会发散

4、单项权重冻结: 当权重项 a 冻结时,如果权重项 b 和权重项 c 达到了收敛(误差为0),然后再尝试训练权重 a , 则 a 也不会移动。因为这时 error 已经为 0 ,delta 已经为 0 ,weight_delat = delta * input 已经为 0 。这揭示了神经网络的潜在的一项负面特性:权重项 a 可能对应着重要的输入数据,会对预测结果产生举足轻重的影响,但如果网络在训练数据中意外找到了一种不需要它可以准确预测的情况,那么权重 a 将不在对预测结果产生任何影响。

def neural_network(input,weights):
    out = 0
    for i in range(len(input)):
        out += (input[i] * weights[i])
    return out

def ele_mul(scalar,vector):
    out = [0,0,0]
    for i in range(len(vector)):
        out[i] += scalar * vector[i]
    return out

toes = [8.5,9.5,9.9,9.0]
wlrec = [0.65,0.8,0.8,0.9]
nfans = [1.2,1.3,0.5,1.0]

win_or_lose_binary = [1,1,0,1]
true = win_or_lose_binary[0]

alpha = 0.3
weights = [0.1,0.2,-0.1]

input = [toes[0],wlrec[0],nfans[0]]

for iter in range(3):
    pred = neural_network(input,weights)
    error = (pred - true)**2
    delta = pred - true
    weight_deltas = ele_mul(delta,input)
    #冻结权重weights[0]
    weight_deltas[0] = 0

    print('Iteration:' + str(iter+1))
    print('Pred:' + str(pred))
    print('Error:' + str(error))
    print('Delta:' + str(delta))
    print('Weights:' + str(weights))
    print('Weights_deltas:' + str(weight_deltas))
    print('')

    for i in range(len(weights)):
        weights[i] -= alpha * weight_deltas[i]

2 多输出梯度下降学习

1、神经网络也可以只用一个输入做出多个预测。在这一案例中,weight_deltas 共享相同的输入节点,同时具有独一无二的输出节点(delta)

#1空白神经网络
weights = [0.3,0.2,0.9]

def ele_mul(scalar,vector):
    out = [0,0,0]
    for i in range(len(vector)):
        out[i] += scalar * vector[i]
    return out

def neural_network(input,weights):
    pred = ele_mul(input,weights)
    return pred

#2预测
wlrec = [0.65,1.0,1,0,0.9]

hurt = [0.1,0.0,0.0,0.9]
win = [1,1,0,1]
sad = [0.1,0.0,0.1,0.2]

input = wlrec[0]
true = [hurt[0],win[0],sad[0]]

pred = neural_network(input,weights)

error = [0,0,0]
delta = [0,0,0]

for i in range(len(true)):
    error[i] = (pred[i] - true[i])**2
    delta[i] = pred[i] - true[i]

#3比较,将其应用于每项权重
def scalar_ele_mul(number,vector):
    output = [0,0,0]
    assert(len(output) == len(vector))
    for i in range(len(vector)):
        output[i] = number * vector[i]
    return output

weight_deltas = scalar_ele_mul(input,delta)

alpha = 0.1

#4学习更新权重
for i in range(len(weights)):
    weights[i] -= (weight_deltas[i] * alpha)


print('Weights:' + str(weights))
print('Weights_deltas:' + str(weight_deltas))

3 具有多个输入和输出的梯度下降

1、梯度下降可以推广到任意大的网络


#多输入,多输出
import numpy as np

#1空白神经网络
#weights 各列分别代表相对应的数据:平均脚趾数、历史胜率、粉丝数
#weights 各行分别代表预测的不同类型:预测是否受伤,预测是否赢球,预测悲伤程度
weights = [[0.1,0.1,-0.3],
           [0.1,0.2,0.0],
           [0.0,1.3,0.1]]

def w_sum(a,b):
    assert (len(a) == len(b))
    output = 0
    for i in range(len(a)):
        output += (a[i] * b[i])
    return output

def vect_mat_mul(vect,matrix):
    assert(len(vect) == len(matrix))
    output = [0,0,0]
    for i in range(len(vect)):
        output[i] = w_sum(vect,matrix[i])
    return output

def neural_network(input,weights):
    pred = vect_mat_mul(input,weights)
    return pred

#2预测

toes = np.array([8.5,9.5,9.9,9.0])
wlrec = np.array([0.65,0.8,0.8,0.9])
nfans = np.array([1.2,1.3,0.5,1.0])

hurt = [0.1,0.0,0.0,0.1]
win = [1,1,0,1]
sad = [0.1,0.0,0.1,0.2]

alpha = 0.1

input = [toes[0],wlrec[0],nfans[0]]
true = [hurt[0],win[0],sad[0]]

pred = neural_network(input,weights)

error = [0,0,0]
delta = [0,0,0]

for i in range(len(true)):
    error[i] = (pred[i] - true[i])**2
    delta[i] = pred[i] - true[i]
print('ori pred: ' + str(pred))
print('delta: ' + str(delta))

#3比较,计算每一项weight_delta,将其应用于对应的权重
def outer_prod(a,b):
    out = np.zeros((len(a),len(b)))
    for i in range(len(a)):
        for j in range(len(b)):
            out[i][j] = a[i]*b[j]
    return out
weight_deltas = outer_prod(input,delta)

#4更新权重
for i in range(len(weights)):
    for j in range(len(weights[0])):
        weights[i][j] -= alpha * weight_deltas[i][j]

print('Weights:' + str(np.array(weights)))
print('Weights_deltas:' + str(weight_deltas))
print('pred:' + str(pred))

4 参考资料

《深度学习图解》

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容