神经网络前向传播和反向传播代码详解
// 1]:# forward for iter in range(30000): alpha=0.001 sent=words2indices(tokens[iterlen(tokens)][1:]) layersloss=predict(sent) // back propagate for layeridx in reversed(range(len(layers))): layer=layers[layer_idx] target=sent[layeridx-1] if(layer_idx> 0): layer['output_delta']=layer['pred']-one_hot[target] new hidden delta=layer['output delta'].dot(decodertranspo // if the last layer - don't pull from a# later one becasue it doesn't exist if(layeridx==len(layers)-1): layer['hidden_delta'] =new_hidden_delta else: layer['hidden delta'] =new hidden delta+layers[layer else: layer['hidden delta'] =layers[layeridx+1]['hidden delta']. // update weights start -= layers[0]['hidden_delta'] *alpha/float(len(sent)) for layer idxlayer in enumerate(layers[1:]): decoder-=np.outer(layers[layeridx]['hidden'],layer['outputd embed idx=sent[layeridx] embed[embed idx] -=layers[layer idx]['hidden delta']*alpha recurrent-=np.outer(layers[layeridx][hidden',layer'hidden if(iter % 1000 == 0): print("Perplexity:"+str(np.exp(loss/len(sent)))) Perplexity:8209227500075585 Perplexity:8187615610433569 Perplexity:8153705034457951 每行代码的意思内容:这段代码是一个循环,用于进行神经网络的前向传播和反向传播。具体的代码含义如下:
- 第1行:循环开始,循环次数为30000次。
- 第2行:设置学习率alpha为0.001。
- 第3行:将tokens列表中的第iter个元素(句子)转换为单词索引。
- 第4行:调用predict函数进行前向传播,得到各层的输出和损失。
- 第6行:从最后一层开始进行反向传播。
- 第7行:获取当前层的信息。
- 第8行:获取当前层的目标值(即当前单词的索引)。
- 第9行:如果不是最后一层,则计算当前层的输出误差。
- 第10行:计算新的隐藏层误差。
- 第13行:如果是最后一层,则只计算当前层的隐藏层误差。
- 第15行:如果不是第一层,则计算当前层的隐藏层误差。
- 第18行:更新第一层的权重。
- 第19行:从第二层开始,更新权重。
- 第22行:如果循环次数是1000的倍数,则打印当前的困惑度(Perplexity)。
最后打印的Perplexity是模型在每1000次迭代后的困惑度值。
原文地址: https://www.cveoy.top/t/topic/pUB6 著作权归作者所有。请勿转载和采集!