用 numpy 构建自己的神经网络
搭建之前的基础与思考
构建模型的基本思想:
构建深度学习的过程:产生idea,将idea转化成code,最后进行experiment,之后根据结果修改idea,继续idea–>code–>experiment的循环,直到最终训练到表现不错的深度学习网络模型。
BP网络的搭建
BPNN v-0.1
目标:搭建一个有学习能力的BP神经网络。
目标完成情况:
●局限:只能计算固定大小的数据尺寸
●局限:只有一层,即为感知机或单层神经网络
有一定了解的可以直接看到代码,代码注释有思路。
idea
●神经元(单层感知机):接收n维列向量x(特征维度为n),输出y的估计。
多组输入x,可以按列堆叠形成矩阵。
●激活函数:Sigmoid、ReLU等
●损失函数:量化模型预测值与真实值的偏差,模型训练的目的是让Loss尽可能小。
例如:
成本函数就是所有训练样本损失函数的平均。
●反向传播时的复合求导
反向传播时只需要计算每一层的导数,最后乘积即可。
整体复盘以及数据流向图
code
根据面向对象编程思想,有两种实现思路,以神经元为最小类或以神经网络为最小类。
这里为了有更清晰的层次选择以神经元为最小类。
自己早数据,假设数据是学生的身高体重,根据此二者预测学生性别。
# Define dataset,已经经过预处理,保留特征
data = np.array([
[-2, -1], # Alice
[25, 6], # Bob
[17, 4], # Charlie
[-15, -6], # Diana
])
all_y_trues = np.array([
1, # Alice
0, # Bob
0, # Charlie
1, # Diana
])
代码:
import numpy as np
# 激活函数与激活函数的求导
def sigmoid(x):
return 1/(1 + np.exp(-x))
def d_sigomid(x):
return sigmoid(x) * (1 - sigmoid(x))
# 神经元
class Neuron:
'''
-神经元基本属性包括权重和偏置量
-神经元方法前向计算和反向传递
-神经元默认接收二维的输入
'''
#初始化,针对特定尺寸的数据集
def __init__(self):
self.weights = np.random.normal(size=(1, 2))
self.bias = np.random.normal()
#前向计算过程集成化,用于训练完成后一步输出预测值
def feedforward(self, inputs):
Z = np.dot(self.weights, inputs) + self.bias
return sigmoid(Z)
#训练函数
def train_epoch(self, x_data, true_value):
'''
-迭代目的是更新权重参数和偏置参数,为了得到梯度需要知道导数
为了计算导数需要知道前向计算过程中的一些值。
训练时按照这个思路去计算需要的值,再更新权重就可以。
'''
#准备工作
learn_rate = 0.1
epochs = 100
for epoch in range(epoch):
for x, y_true in zip(x_data, ture_value):
#前向计算
z = np.dot(self.weight, inputs) + self.bias
y = sigmoid(z)
#损失函数采用平方差计算,求导较为容易
#l = (y - true_value) ** 2
#只有需要查看效果的轮次才计算输出
#一般只需要知道l关于y的导数即可,并不需要计算l的值
#反向传播
d_L_d_y = -2 * (y_true - y)
d_y_d_z = d_sigmod(z)
d_z_d_w1 = x1
d_z_d_w2 = x2
#实际计算可以合并很多步骤,这里分开写为了使过程更清晰
dw1 = d_L_d_y * d_y_d_z * d_z_d_w1
dw2 = d_L_d_y * d_y_d_z * d_z_d_w2
db = d_L_d_y * d_y_d_z
#体现了反向计算的复合过程
#更新
self.w[0] -= learn_rate * dw1
self.w[1] -= learn_rate * dw2
self.b -= learn_rate * db
if epoch % 10 == 0:
if epoch % 10 == 0:
y_preds = np.apply_along_axis(self.feedforward, 1, data)
loss = ((y_preds - y_true) ** 2).mean()
print("Epoch %d loss %.3f" % (epoch, loss))
BPNN = Neuron()
BPNN.train(data, all_y_trues)
experiment
记录1
尝试调参,没有效果
尝试输出一些中间值,发现预测结果是没问题的,只是loss的计算有问题
预测值是二维的列,真实值是一维的行,np广播相减直接出来一个4*4的矩阵。做减法时加一个转置就OK
记录2
原因很明显,问题过于简单且没有噪音。
增加了一些数据并加入少量噪音。
能明显看到loss的下降过程,说明实验成功。
BPNN v-0.2向量化
上一篇: 一篇文章解读谷歌 BBR 拥塞控制算法
下一篇: CSS 选择器的常见用途
推荐阅读
-
身体焦虑?大码女装用实力SayNo--"书",了解更多新书拥有者数量内容 作者:小胖鸭小肥鸭 来源:趣谈神奇数字 近日,杨天真现身奇葩说,一边分享职场生存法则,一边大闹自己的大码女装品牌Plusmall。 杨天真是谁?她是壹心娱乐CEO,范冰冰、张艺兴、张雨绮等明星的前经纪人,被称为 "娱乐圈教母"。但她在2020年6月突然宣布卸下所有经纪业务,成立Plusmall,转战直播行业专心带货,第一代网红雪梨就在她的签约名单中。 在 "A4腰"、"BM风"、"筷子腿 "等流行的当下,"以瘦为美 "依然是主流审美。一向眼光犀利的杨天真,为何会选择一条看似与众不同的道路呢?其实,除了杨天真,越来越多的时尚品牌都开设了大码专线,比如耐克、H&M。 关于大码女装,你了解多少?市场潜力如何?为什么会有越来越多的参与者入局?主要形式是什么? A 超重人群居高不下,大码市场潜力数百亿美元 著名医学杂志《柳叶刀》显示,全球有 1/3 的人口超重(指 BMI 指数为 25 的人口),其中我国 4% 的超重人口(约 2.5 亿)已超过美国居世界首位。 图:超重人口比例 来源:《柳叶刀》杂志柳叶刀 国务院新闻办公室发布的《中国居民营养与慢性病状况报告(2020)》显示,我国城乡各年龄段居民超重率和肥胖率持续上升,18岁及以上居民超重率和肥胖率分别为34.3%和16.4%。
-
实现你童年的神奇宝贝,用 Python 教你画一只属于自己的皮卡丘!
-
[小型团队自动化] (II) 使用 Vault 作为凭证存储的无人机 CI -- 构建自己的 CI/CD 工作流程
-
用 JavaScript(JScript)编写 ASP 程序(用服务器端 javascript 构建 asp)的优缺点和经验。
-
用自己的电脑建立可访问外部网的服务器
-
加入八戒工作室,我感觉自己要发财了!"在大型节目中,这位前央视导演用一句话让全场观众看到了他的实力!
-
用 R 中的神经网络预测时间序列:多层感知器和极限学习机
-
NeurIPS 2022 | 最强斗地主AI!网易互娱AI Lab提出基于完美信息蒸馏的方法-完美信息蒸馏(PTIE) 在斗地主游戏中,非完美信息的引入主要是由于三位玩家均不能看到别人的手牌,对于任意一位玩家而言,仅可知道其余两位玩家当前手牌的并集,而难于精准判断每位玩家当前手牌。完美信息蒸馏的思路是针对这种非完美问题,构建一个第三方角色,该角色可以看到三位玩家的手牌,该角色在不告知每位玩家完美信息的情况下通过信息蒸馏的方式引导玩家打出当前情况下合理的出牌。 以强化学习常用的 Actor-Critic 算法为例,PTIE 在 Actor-Critic 算法的应用中可以利用 Critic 的 Value 输出作为蒸馏手段来提升 Actor 的表现。具体而言即在训练中 Critic 的输入为完美信息(包含所有玩家的手牌信息),Actor 的输入为非完美信息(仅包含自己手牌信息),此种情况下 Critic 给予的 Value 值包含了完美信息,可以更好地帮助 Actor 学习到更好的策略。 从更新公式上来看,正常的 Actor-Critic 算法 Actor 更新的方式如下: 在 PTIE 模式下,对于每个非完美信息状态 h,我们可以在 Critic 中构建对应的完美信息状态 D(h),并用 Critic 的输出来更新 Actor 的策略梯度,从而达到完美信息蒸馏的效果。 PTIE 框架的整体结构如下图所示: 无论是训练还是执行过程中智能体都不会直接使用完美信息,在训练中通过蒸馏将完美信息用于提升策略,从而帮助智能体达到一个更高的强度。 PTIE 的另一种蒸馏方式是将完美信息奖励引入到奖励值函数的训练中,PerfectDou 提出了基于阵营设计的完美信息奖励 node reward,以引导智能体学习到斗地主游戏中的合作策略,其定义如下: 如上所示,完美信息部分 代表 t 时刻地主手牌最少几步可以出完,在斗地主游戏中可以近似理解为是距游戏获胜的距离, 代表 t 时刻地主阵营和农民阵营距游戏获胜的距离之差, 为调节系数。通过此种奖励设计,在训练时既可以一定程度地引入各玩家的手牌信息(出完的步数需要知道具体手牌才能计算),同时也鼓励农民以阵营的角度做出决策,提升农民的合作性。 特征构建: PerfectDou 针对牌类游戏的特点主要构建了两部分特征:牌局状态特征和动作特征。其中牌局状态特征主要包括当前玩家手牌牌型特征、当前玩家打出的卡牌牌型特征、玩家角色、玩家手牌数目等常用特征,动作特征主要用于刻画当前状态下玩家的所有可能出牌,包括了每种出牌动作的牌型特征、动作的卡牌数目、是否为最大动作等特征。 牌型特征为 12 * 15 的矩阵,如下图所示: 该矩阵前 4 行代表对应每种卡牌的张数,5-12 行代表该种卡牌的种类和对应位置。 网络结构和动作空间设计 针对斗地主游戏出牌组合数较多的问题,PerfectDou 基于 RLCard 的工作上对动作空间进行了简化,对占比最大的两个出牌牌型:飞机带翅膀和四带二进行了动作压缩,将整体动作空间由 27472 种缩减到 621 种。 PerfectDou 策略网络结构如下图所示: 策略网络结构同样分为两部分:状态特征部分和动作特征部分。 在状态特征部分,LSTM 网络用于提取玩家的历史行为特征,当前牌局状态特征和提取后的行为特征会再通过多层的 MLP 网络输出当前的状态信息 embedding。 在动作特征部分,每个可行动作同样会经过多层 MLP 网络进行编码,编码后的动作特征会与其对应的状态信息 embedding 经过一层 MLP 网络计算两者间的相似度,并经由 softmax 函数输出对应的动作概率。 实验结果
-
使用阿里云服务器构建自己的 Minecraft 服务器配置的建议在这里!
-
像首席技术官一样思考:如何高效管理 30 人的研发团队?-管理越多越轻松。好的研发团队,应该是上拨下用,即下级对上级的向上管理;而不是反过来,总是向下管理,甚至是 CTO 做经理的事,经理做工程师的事,工程师最终会被当成实习生。如果是这样,就会越管越累,不仅团队无法成长,而且团队整天很忙还效率低下,问题一大堆。 有这样一个小故事:一位高级经理下班后帮忙倒垃圾,结果被老板训斥了一顿。这就好比首席技术官做了实习生自己该做的事。事情本身没有对错之分,只是从不同的角度有不同的理解。 古人云:"用人不疑,疑人不用"。在面对自己的研发团队时,应该相信他们能做好,授权一线开发人员充分发挥专业特长,不要限制他们的工作。但在相信他们的同时,也要进行二次确认,始终秉持 "我相信,但我要确认 "的原则和严谨的精神。因为每个人都会犯错和疏忽,通过发挥团队的智慧,团队犯错的机会就会大大减少。比如回归测试、代码审查、开发演示、变更审批等等。 如前所述,每个人都难免会犯错。但作为管理者,你所设计和商定的流程不能出错。管理者的每一个决定和沟通都应该经过深思熟虑。就像红绿灯的交通设计,某辆车不小心闯红灯可能会扣分,但红绿灯的设计一定要正确、人性化、统一。再比如,开发人员可能会因为疏忽大意写出 bug,但研发流程的设计和上线流程的发布不能有任何差错。因此,流程体系的设计,一方面要结合当前团队规模、业务特点和需要重点解决的问题来设计,另一方面也要在人员防错、效率提升、发挥团队集体智慧等维度进行综合考量。应该站在更高更抽象的角度去思考,不断思考一个倍受欢迎的园区应该如何设计,思考一个灵动、经典、永恒的建筑应该遵循怎样的模式,思考一个成功、优秀、卓越的研发团队应该需要怎样的流程和制度。 最后,反馈很重要。向上汇报很重要,向下反馈也很重要。能够保持顺畅的双向反馈和闭环管理,对研发团队的协作和沟通有着非常明显的积极作用。在向上汇报方面,要培养团队在正式汇报、会议汇报、私下沟通、书面总结、非正式场合等方面的沟通能力,提醒下属报喜也要报忧。凡事先记录,再跟进,最后反馈。反馈很重要,主动汇报更难得。 另一方面,同时也不要忽视向下反馈。好的爱,是双向的。团队也是如此,没有严格的上下级之分,只是分工和角色不同而已。作为管理者,不必总保持一种 "神秘感",让人 "捉摸不透 "才是牛。当团队做得好或有人做得好时,要记得在公开或私下场合给予肯定和赞许。业务有增长、业绩有提升时,别忘了给团队一些鼓励,或者安排一次下午茶或聚餐。在例会或正式会议上,也可以同步向大家传达一些重要信息和高层指示。"欲速则不达,欲远则同行"。 当向上汇报、向下反馈的沟通闭环形成后,同时结合前面研发过程的管理闭环,双管齐下,就能形成良性循环。如此反复,持之以恒,优秀卓越的研发团队,必将呈现。 能力、产出和效率 接下来,继续重复关于能力、产出和效率的话题。 站在不同的角色,以及一个企业经营、生存和发展所需要的基础上,我把研发生产力分为三个层次,分别是:一线员工关心的研发能力、管理层关心的软件产出和操作人员关心的企业生产效率。简单概括就是:既要把工作做好,又要能出成果,还要能帮企业赚钱。