首席财务官管理预测不确定性的一个简单方法(使用蒙特卡罗和 R)
财务专业人士有无数种方法来预测销售,但我们并不想涵盖这些方法。本文的目标是帮助财务专业人员使用蒙特卡罗和 R 更好地管理预测不确定性,能够回答以下业务问题之一:
“你的组织达到目标的可能性有多大?”
“您组织的预测风险状况如何?”
这不再仅仅是估计目标(例如:根据我们知道的过去发生的事情重新预测第四季度)。它是关于评估目标内的风险水平,并进行数据驱动的业务对话,讨论我们如何做才能实现预期的结果。它还将为财务专业人员提供机会,使他们在管理预测的方式上更具战略性(例如,是时候考虑纳入即将到来的新机会了吗?我们应该等吗?我们是否过多或过少的承诺?).
虽然在 Excel 中进行蒙特卡洛模拟相对容易,但我个人更喜欢使用 R,因为可以利用 R 库来拟合分布和生成蒙特卡洛模拟的样本数据。
对于这个练习,我们将使用一个简化的案例,它需要很少的库。通过几行代码,我们将能够清楚地回答这个问题:
“风险很高。就目前的情况来看,我们不太可能达到目标(例如,不到 33%的可能性)。让我们想出一个计划来弥合这一差距。”
本例中我们需要的是:
- 一个商业问题/背景 —“我们在第三季度完成了 1.417 亿部,我们的年度目标是 1.860 亿部;我们实现它的概率有多大?”
- 一个观察到的时间序列——某产品 ABC 按月销售的数量。
- 年度目标 —到年底,ABC 至少售出 1.86 亿件产品。
我们将使用以下方法来回答这个问题:
- **第一步:**准备数据。
- 步骤 2 A: 对观察到的时间序列进行传统分布拟合。
- 步骤 2 B: 对观察到的时间序列进行“补充”分布拟合。
- 步骤 3: 为 10 月、11 月和 12 月生成一个包含 10,000 个样本的数据表。
- **第四步:**生成概率,比较两个选项(选项 A = 26.75% /选项 B = 33.2%)。在这个例子中,一个很大的收获是,通过利用更好的拟合分布变得更精确不会显著改变业务结果(例如,两种方法之间 5%的风险差异)。
- **第 5 步:**向业务部门报告风险很高,而且就目前的情况来看,他们不太可能达到目标(例如,低于 33%的可能性)。然后,想出一个缩小差距的计划。
**第一步:**准备数据
| library(RCurl)# Read data
mydata <- read.csv(text = getURL("https://raw.githubusercontent.com/tristanga/MonteCarlo_ForecastRisk/master/TS.csv"))# Create time serie
tseries <- ts(mydata$x, frequency = 12, start = c(2000, 1))# Check the time serie
start(tseries)
end(tseries)
frequency(tseries)# Remove Q4
tseries_sub <- window(tseries, start=c(2000, 1), end=c(2015,9))# Define your target
mytarget = 186.0000# Calculate actuals
actualYTD <- sum(window(tseries, start=c(2015, 1), end=c(2015,9)))# Check the distribution of your time serie
hist(tseries_sub)
boxplot(tseries_sub)
tseries_df = as.data.frame(tseries_sub)
步骤 2 A: 对观察到的时间序列进行传统分布拟合。
|library(fitdistrplus)
fit.norm <- fitdist(as.numeric(tseries_df$x), "norm")
fit.exp <- fitdist(as.numeric(tseries_df$x), "exp")
fit.weibull <- fitdist(as.numeric(tseries_df$x), "weibull")
fit.lnorm <- fitdist(as.numeric(tseries_df$x), "lnorm")
fit.gamma <- fitdist(as.numeric(tseries_df$x), "gamma")
fit.logistic <- fitdist(as.numeric(tseries_df$x), "logis")
fit.cauchy <- fitdist(as.numeric(tseries_df$x), "cauchy")# Compare Goodness-of-fit statistics
gofstat(list(fit.norm, fit.exp, fit.weibull,fit.lnorm,fit.gamma,fit.logistic,fit.cauchy),
fitnames = c("fit.norm", "fit.exp", "fit.weibull","fit.lnorm","fit.gamma","fit.logistic","fit.cauchy"))# the best Goodness-of-fit statistics is for the normal distribution
option1 = fit.norm
summary(option1)
第二步 B: 对观察到的时间序列进行“补充”分布拟合。
|# Using Supplementary Distributions to fit the second option
library(SuppDists)
parms<-JohnsonFit(as.numeric(tseries_df$x), moment="quant")# plot the distribution
hist( as.numeric(tseries_df$x) , freq=FALSE)
plot(function(x)dJohnson(x,parms), 0, 20, add=TRUE, col="red")# let's create samples for october, november and december
option2 <- function(x)qJohnson(x,parms)
**第三步:**为 10 月、11 月和 12 月生成一个包含 10,000 个样本的数据表。
|#Option 1
library(truncnorm)
fit.coef <- coef(fit.norm)
final_df1 <- as.data.frame(rtruncnorm(n=10^4, a=min(tseries_df$x), b=max(tseries_df$x), mean=fit.coef["mean"], sd=fit.coef["sd"]))
colnames(final_df1) <- 'Oct'
final_df1$Nov <- rtruncnorm(n=10^4, a=min(tseries_df$x), b=max(tseries_df$x), mean=fit.coef["mean"], sd=fit.coef["sd"])
final_df1$Dec <- rtruncnorm(n=10^4, a=min(tseries_df$x), b=max(tseries_df$x), mean=fit.coef["mean"], sd=fit.coef["sd"])
final_df1$Forecast <- actualYTD + final_df1$Oct + final_df1$Nov +final_df1$Dec#plot histogram of forecasted quantities
hist(final_df1$Forecast)#Option 2
option2 <- function(x)qJohnson(x,parms)
option2sample <- option2(runif(10000))
hist(option2sample)
boxplot(option2sample,as.numeric(tseries_df$x) )
final_df2 <- as.data.frame(option2(runif(10000)))
colnames(final_df2) <- 'Oct'
final_df2$Nov <- option2(runif(10000))
final_df2$Dec <- option2(runif(10000))
final_df2$Forecast <- actualYTD + final_df2$Oct + final_df2$Nov +final_df2$Dec# Plot Option 2
hist(final_df2$Forecast)
**第四步:**生成概率,比较两个选项(选项 A = 26.75% /选项 B = 33.2%)。
|boxplot(final_df1$Forecast,final_df2$Forecast)
myproba1 <- sum( final_df1$Forecast >= 186 ) / 100
myproba2 <- sum( final_df2$Forecast >= 186 ) / 100
**第 5 步:**向业务部门报告风险很高,就目前的情况来看,他们不太可能达到目标(例如,低于 33%的可能性)。然后,想出一个缩小差距的计划。
后续步骤:
- 增加复杂性(每个月的分布与整个时间序列,利润与销售量,在模型中包括增长/CAGR,外部变量等。).
- 为金融专业人士写一写预测定量时间序列的其他相关统计方法。
请注意,蒙特卡罗方法有一些风险/注意事项需要牢记:1)我们使用过去来预测未来,而不考虑除先前销售数量分布(人口、价格等)之外的任何外部因素。),2)观测到的时间序列分布会随时间而变化;虽然选项 2 中的模型应遵循这些变化,但重要的是要不时检查它是否仍然紧密遵循选定的分布。
该代码可在 Github 上获得。谢谢你看我的帖子。这是我在媒体上的第一篇文章。如果您遇到过类似的挑战,或者您希望在您的组织中得到帮助,请随时联系我。
数字存在的在线模式
分析我的谷歌档案搜索数据
目前(2018 年 8 月),西方国家关于电子记录和数据收集的集体良知处于最高点。有些人甚至可能会说,我们的意识已经稳定下来,因为我们不再每天都收到隐私更新电子邮件。由于新的数据保护政策在欧洲的实施,我敢肯定,你的收件箱是/曾经是充满了一般数据保护条例(GDPR)通知。世界各地的公司现在都在争先恐后地遵守法规,增加透明度。毕竟,脸书+剑桥分析公司的崩溃和谷歌自私的账本视频不久前才曝光。
现在,许多人开始质疑我们是如何走到这一步的,是否有出路,以及我们如何量化科技公司收集的数据的价值/成本( Smith,2018 )。虽然像谷歌这样的公司收集各种数据(关于我们的一切联合国/想象不到的东西),但他们也提供免费服务(《经济学人》,2017 )。现在,一些人正试图打一场仗来收回他们的数据,这让我产生了一个问题——如果我们收回数据,我们会怎么做?所有这些思考让我想到了这篇文章的要点——分析你的谷歌数据。你可以在文章末尾找到所有关于如何挖掘你自己的数据的说明。
挖掘我的谷歌档案
这一努力始于一项练习,旨在吸引和鼓励参加我的商业分析课程的学生通过将他们的分析技能应用于他们的个人数据来学习 R。在这里,我将分享我从挖掘我的谷歌档案中发现的东西。我会在文末分享一个循序渐进的帖子。
搜索数据:从存档到一张表
作为谷歌用户,我们不知道我们在这个平台上花了多少时间。时间戳给了我们很多关于谷歌搜索模式的信息。通过对时间戳、搜索类型和文本进行分类,可以创建一个简明的 google 存档数据数据集。免责声明:只要谷歌不改变其交付用户档案或 html 代码的方式(scraper 的 2.0 版本),这个 scraper 就能工作。
数据分析:可视化谷歌搜索
为了对搜索量有一个总体的概念,让我们按年份来看搜索量。有趣的是,我的最高搜索量与我的研究生时代相符。更进一步,我相信我在 2013 年或 2014 年开通了这个谷歌账户(专业版)。从学生们做的谷歌挖掘中,我看到了开放 10 到 15 年的账户的数据。特别是来自中国的学生发现的另一个有趣的模式是,他们可以通过在特定时间段内缺乏搜索数据来追踪他们在中国和美国之间的所有旅行。
由于我迄今为止最多产的搜索年份是 2015 年、2016 年和 2017 年,我决定更仔细地研究它们。在夏季,搜索量明显下降,这是有道理的,而在学期的最后几个月,搜索量有所增加。
我能睡多久?
另一个有趣的指标是给定时间内的搜索量。令人惊讶的是,我的搜索高峰时间是在下午,从下午 1 点到 6 点。这种见解让我更仔细地考虑我的行为,以确定为什么我可能会在下午更多地使用谷歌。
每小时的搜索模式在一周的每一天都非常相似,如下图所示。我现在发现,周一我倾向于工作到深夜,我的搜索会超过午夜,并与周二的搜索重叠。
我周末可以休息吗?
虽然我假设任何谷歌搜索都只是为了专业或工作目的,但有趣的是,在我休息的日子里,搜索量只减少了大约 33%。这可能反映了与家庭作业相关的搜索,因为被分析的年份是我在研究生院的年份。我最活跃的日子是从一周的开始到一周的中间/结束(周四),在周三达到高峰。我想知道其他人是否会有类似的结果。
按年份和工作日列出的搜索总数
当按年份和工作日比较完整的数据集时,很明显,到目前为止,我谷歌搜索最多的年份是 2015 年,这与我在学校的想法一致。
云这个词
谁不喜欢好词云?营销人员和商人喜欢它们。下面是我搜索的前 100 个单词的单词云,最低频率为 100。这些词通常反映了我作为数据科学家每天使用的软件堆栈。虽然 Enrico Bertini 可以为你提供世界云的许多其他更好的替代方案(拆开单词云),但单词云似乎可以吸引商学院学生学习分析和编程的注意力。
我希望你对我的网上行为的探索感兴趣。随着分析的进展,我希望你注意到谷歌对我们的在线行为了解多少。请记住,这只是谷歌 46+产品网络中的一个产品的数据。希望这能激发你挖掘自己的谷歌数据的兴趣。你可能会发现有趣的个人行为模式,你可能会决定改变管理隐私设置的方式,谁知道呢——你甚至可能会决定早点睡觉。
这里是一个博客,一步一步的指导你如何分析你自己的谷歌搜索数据。
从你的在线行为中学习
medium.com](https://medium.com/@jlroo/mining-google-archive-search-data-with-r-51f4f76c2d21)
来源
史密斯,史黛西·瓦内克。“社交媒体公司应该为我们的数据付费吗?” NPR ,NPR,2018 年 4 月 12 日,www . NPR . org/2018/04/12/601759872/should-social-media-companies-pay-us-for-our-data。
“自由经济是有代价的。”《经济学人》《经济学人》报 2017 年 8 月 24 日www . Economist . com/finance-and-economics/2017/08/24/The-free-economy-comes-at-a-cost。
Harris,“被认为有害的词云”,Niemanlab,2011 年 10 月 13 日,http://www . nieman lab . org/2011/10/Word-clouds-considered-habital/
Bertini,e .“将单词云拆开”,Medium,2017 年 10 月 16 日,https://Medium . com/@ FILWD/Taking-Word-Clouds-Apart-alternative-designs-for-Word-Clouds-and-some-research-based-guidelines-df 91129 aa 806
5 月 17 日,The Verge。2018,https://www . the verge . com/2018/5/17/17344250/Google-x-自私-账本-视频-数据-隐私
斯蒂芬斯-达维多维茨(2017 年)。每个人都在撒谎大数据、新数据以及互联网能告诉我们关于我们到底是谁的信息。纽约州纽约市:戴街。
线性回归在线学习
使用 Python 实现线性回归和梯度下降在线学习的简单方法。
Source http://tomtunguz.com/key-ingredient-machine-learning
你有没有想过,机器学习应用程序如何在少数情况下实时给出结果?机器学习从业者如何在容纳新样本/或训练数据的同时,一次又一次地训练大数据?如果是的话,这里有一个幼稚的指南。我将解释一些关于我们如何使用 Python 实现在线学习机器学习算法的基本概念。
下面是 python 中源代码的 Github 链接和一个样本数据集,按照 Coursera 吴恩达机器学习课程给出的问题集。
这是一个从头开始线性回归的 Python 代码,带有梯度下降实现和…
github.com](https://github.com/bmonikraj/linear-regression-scratch/blob/master/LinearGD.py)
大多数机器学习应用程序遵循以下方法。这是一个迭代过程,每一步都可能根据需要执行。这三个基本步骤是
- 数据收集和预处理
- 数据集上的计算
- 可视化和分析
在本文中,我将主要关注上面提到的第二个子模块——数据集上的 计算。
现在,为了更好地理解,我将用代码同时解释这些概念。
在线训练 :-这是一种学习步骤的改进方法,其中所用模型的权重根据新到达的数据进行更新,而不是重新训练整个模型。这基本上是一种循序渐进的学习方法。这种训练的应用主要可以在实时应用中找到,实时应用为此目的使用预测或分类模型。
import pandas as pd
import numpy as np
data = pd.read_csv("path_to_file.csv")
Y = data["Name of the Column"]
del data["Profit"]
bias = pd.Series(1,index=range(len(Y)))
data["Bias"] = bias
Header_X_Bias = list(data.columns.values)
Header_X_Bias = Header_X_Bias[:-1]
Header_X_Bias.insert(0,"Bias")
data = data[Header_X_Bias]
X = np.array(data)
Y = np.array(Y)
Y = Y.reshape(len(Y),1)
Theta = [0,0]
Theta = np.array(Theta)
Theta = Theta.reshape(2,1)#Here Theta is the global variable
我们将使用 Pandas 库从文件中读取数据集,使用 NumPy 模块执行线性代数计算。
在导入模块之后,我将数据集读入“数据”变量。从那里,我分离出了数据集的因变量“y”(在我们的例子中是“利润”(更多细节请参考 GitHub 参考资料)),并在 X 集中添加了一个值为 1 的 Bias 列。给定的数据集只有一个要素。
y:利润
X : Xi 是 X 矩阵的第 I 行向量(X 的维数是‘m’X ^ 2 ),其中 Xi 的维数是 2。
X[0]:偏置;X[1]:原始单一特征
对于 numpy 计算,X 和 Y 都以适当的矩阵格式被重新整形,并且初始θ也被声明为值[0,0],因为特征维数是 2,包括偏差。
def cost(X,Y,Theta):
Hypothesis = np.dot(X,Theta)
Error = Y - Hypothesis
#Matrix method for calculating Cost
Cost = np.dot(Error.T,Error)/(2*len(Error))
return Cost[0][0]
然后,定义代价函数,它以三个参数作为输入,第一个是 X,第二个是 Y,第三个是θ。在函数内部,它首先计算假设,然后以矢量化的方式计算成本。
Let
m = Total number of training examples
d = Total number of features including bias = 2
Dimension of X : (m,d)
Dimension of Y : (m,1)
Dimension of Theta : (d,1)
Dimension of Loss : (m,1)
注意:总是建议尽可能使用矢量化形式的计算,而不是循环,使用像 numpy 这样的线性代数库,以便大大优化计算时间。
alpha = 0.01
Iterations = 1500
“alpha”和“迭代”步骤被声明为常量。
在算法中,我们把迭代次数作为收敛的决定因素。你也可以把θ和ε阈值的变化作为收敛的决定因素。
def gradient(X,Y,Theta,Iterations,alpha):
for i in range(Iterations):
Loss = Y - np.dot(X,Theta) + (np.dot(Theta.T,Theta)*0.001)
Cost = cost(X,Y,Theta)
Loss = Loss*(-1)
dJ = (np.dot(X.T,Loss)*2)/len(Y)
Theta = Theta - (alpha*dJ)
return Theta
上面的代码片段是梯度下降函数的定义。它以 X,Y,Theta,迭代次数和 alpha 为参数。
它循环到“迭代”步骤,并且在每一步中,它根据成本值修改它的θ值。在每个循环中,都要计算损耗。
损失= Y 假设
(np.dot(Theta。t,Theta)*0.001) =这是正则项
假设=点积(X,θ)
计算损失后,在每个循环中,每个参数的偏导数(对应于特征的θ值)以矢量化格式计算如下
(2 *点积(X.T,损失))/m
最后θ被更新为
θ=θ-(α*偏导数)
在上述类似的过程中,θ是更新“迭代”次数,梯度函数返回最终更新的θ。
Theta = gradient(X,Y,Theta,Iterations,alpha)#Here Theta is the global variable
到目前为止,我们已经得到了一种计算更新后的θ的方法,其中考虑了损失和迭代次数。
现在我们的任务是拥有在线学习的功能。基本上,在线学习是一个改进的中间步骤,我们只更新“K”次损失的权重,认为“K”是 x 中没有的新数据。
因为,我们将使用从梯度函数中获得的更新和训练的θ,在每个在线学习实例中,θ将总是更新的。下面我将向你展示一个定义在线学习功能的代码片段。
def online_train(Xn, Yn, Theta):
Loss = Yn - np.dot(Xn,Theta) + (np.dot(Theta.T,Theta)*0.001)
Loss = Loss*(-1)
dJ = (np.dot(Xn.T,Loss)*2)/len(Y)
Theta = Theta - (alpha*dJ)
return Theta
online_train 函数类似于梯度函数,只是差别不大。区别在于传递给函数的θ。在梯度函数的情况下,传递的θ是随机初始化值[0,0],而在 online_train 函数的情况下,θ是从梯度函数返回的预训练的θ。
K = Total number of new data (Generally K = 1)
Dimension of Xn : (K,d)
Dimension of Yn : (K,1)
每当有新数据到来时,就会调用 online_train 函数,比如
#On Arrival a new single data vector
Theta = online_train(X_new, Y_new, Theta)
#X_new : new data vector
#Y_new : Y value corresponding to X_new
对于预测,使用θ,可以预测测试数据的值。
在线学习最好的部分是它非常适应新的训练集,并且它可以基于新的训练集更新 Theta,甚至不需要重新训练整个数据集。
在线学习的一个主要优点是,在实时应用程序中实现时,它非常节省空间。在第一个训练阶段之后,可以丢弃 X 和 Y,因为我们已经得到了θ,它可以在将来用于进一步的计算。
此外,在线学习也可以用于完整的训练,每次在循环中传递单个数据向量,并在每个循环步骤中更新 Theta(权重)。通过这种方式,可以可视化收敛,并且如果感觉收敛已经实现,可以停止迭代以实现计算优化。该方法在某种程度上类似于神经网络概念。
如果你听说过在线学习,那么我想你一定也听说过批量培训。批量训练是在线学习的修订版,其中*‘K’>1*,主要是*‘K’=批量*,这取决于*‘m’(训练集中的观察次数)*。两种算法在收敛期间访问相同的最小值点,只是它们在训练数据样本的不同点更新它们的θ。
如果我们列出在线学习的好处
- 这对于空间优化非常有用,因为空间是一个问题。
- 它可以在实时应用中使用,其中模型应该适应新的数据点。
- 在线学习最重要的应用可以在网络应用中找到,这些应用基于预测建模、分类和推荐系统的原理。
随着对机器学习算法的更好理解,并深入研究权重更新的数学概念,如梯度下降、反向传播、 adam 等,人们可以很容易地设计出针对特定机器学习算法的在线训练解决方案。关键是以尽可能好的方式从数学上理解算法。
**在线学习的进步可以为在产品中实时实现机器学习方法带来巨大的转变,并为产品的用户提供更好的用户体验。**最后,向着理想的人工智能只差一步。
进一步阅读
- 优化者—http://ruder.io/optimizing-gradient-descent/index.html
- 在线学习—https://www . coursera . org/learn/machine-learning/lecture/ABO2q/online-learning
[仅 Numpy ]通过 Numpy 中的 ZCA 白化反向传播[手动反向传播]
gif from this website
阅读前,请注意几件事。
- 这篇帖子的灵感来自 2018 年 CVPR 论文“去相关批次标准化”。
- 我一直很懒,结果我已经在这个帖子上工作了三个星期,因此很多不同的材料混杂在一起。(换句话说,这篇文章对我来说更像是一篇个人笔记。又名这是我做过的最垃圾/无意义的帖子。)
最后,在这篇文章中,我将看到 3 个全连接神经网络(带有 zca 白化层)在时尚 mnist 数据集上的表现。
请注意,这篇帖子是为了我未来的自己查阅相关资料,并回顾我做的一些个人笔记。
去相关批量归一化
Algorithm from this paper
我就开门见山了,批量规范化对给定的数据执行标准化。我们可以根据每个示例或每个维度进行标准化,这取决于用户。现在让我们用 ZCA 美白手术来代替。(我不会解释什么是 ZCA 美白手术,但这里有一些阅读材料。ZCA 白化和 PCA 白化有什么区别、协方差矩阵和数据分布、白化和统计白化。)这就是论文“去相关批处理规范化”的作者所做的,这种去相关批处理规范化不仅使给定数据居中,而且使它们白化。(并且从该论文中呈现的前馈操作可以在上面看到。).现在,我不打算将数据居中,而是只打算创建一个执行 zca 白化的层。
ZCA 增白层(前馈/反向传播)
如上所述,当在 numpy 中实现 zca 白化时,它看起来像上面一样,其中我们首先计算协方差矩阵(或者每个例子或者每个维度,由您决定。),执行特征值分解并创建白化矩阵,最后执行矩阵之间的点积。(输入和白化操作。)
第一行 →原始数据
第二行 →白化数据(不居中)
第三行 →白化数据(居中)
为了确认我的实现,让我们看看其他人实现的白化操作是否会产生相同的结果。
Used the code from this website
好的,看起来是可行的,现在让我们实现反向传播算法。
If anyone asks, I will do a more detailed mathy? post on driving this
这里有一件事我想提一下,在 sigma 后执行反向传播时,我们可以对称化矩阵。如下所示。
image from this paper
诸如“正交权重归一化:深度神经网络中多个依赖 Stiefel 流形的优化解决方案”的论文已经提出了这一点。但是我不打算用它。还有,论文’线性代数:矩阵演算’给了我很多帮助。现在让我们移动到一些不同的层,如中心层。
居中层(前馈/反向传播)
如果我们只想很好地将数据居中(即居中层),我们可以定义一个如上的层。我们可以选择通过示例或维度来确定给定矩阵的中心。现在让我们看看这一层如何影响给定的数据。
Original Data
Centered Data
如上所述,中心层只移动数据,使每个轴的平均值为零,就这样,它对协方差矩阵没有任何影响。该操作在快速 ICA 之前完成,如这里的所示。然而,这样做并不是 100%必要的。通过这一层的反向传播实际上非常容易,因为这是批量标准化的第一步。
image from this website and this website
image from this [website](http://Efficient Batch Normalization - Pedro Costa. (2018). Costapt.github.io. Retrieved 21 August 2018, from https://costapt.github.io/2016/07/09/batch-norm-alt/) and this website
我不会深入细节,但是从很多不同的来源,我们可以知道,对 dmu/dx 的导数就是 1/m,其中 m 是例子的数量。因此,如果我们的中心层具有公式 f(x) = x-mu,其中 mu 是平均向量。我们可以说 df(x)/dx = 1-(1/m)。
ZCA 美白层实验
图像顺序为,原始、居中、标准化、zca 白化、两者均标准化白化。(维度方面,示例方面)。
上面的图像只是为了显示每一个变换的效果,我按照图像的顺序显示它们,直方图和协方差矩阵。(在 100 个例子中)在修改了很多值之后,我发现只使用增白层可以得到最好的效果。(最后,我还比较了不同的图像。)
在仅仅 15 个纪元之后,我们可以观察到,这个简单的 3 全连接层网络能够在时尚 mnist 数据集上胜过 GRU + SVM。
左图 →训练图像的平均精度/成本
右图 →测试图像的平均精度/成本
测试图像的最终精度是 89.51(如下所示),如果我们考虑到我们只使用了一个简单的三个完全连接的神经网络,没有数据增强或任何类型的预处理,这似乎是非常有竞争力的。
Image from this website
然而,当 GRU + SVM 与辍学层配对时,它的表现比我们的网络高出 0.2%。
交互代码
对于 Google Colab,你需要一个 Google 帐户来查看代码,而且你不能在 Google Colab 中运行只读脚本,所以在你的操场上复制一份。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要访问这篇文章的代码,请点击这里,要访问培训日志,请点击这里。
有点奇怪?作者原始论文的发现
Image from this website
在研究这个课题时,我意识到作者可能犯了一个错误。如上所述,我们可以看到作者的前馈操作和反向传播的方法。现在让我们把这个拆开…
在前馈操作的最后一行,我们用白化矩阵 D 和原始数据 x 执行点积。例如,我们说每个矩阵的维数大约为 D 的(NN)和(ND ),其中 N 是示例的数量,D 是数据的维数。(同样,我们可以通过示例数量或维度方式对数据进行白化。)
我们知道白化层的输出维数是(DN),因此关于 x_hat 的梯度将具有相同的维数。然而,我们正在尝试执行矩阵(ND)和(N*N)之间的点积。(答 7)。所以我认为这些符号有点不对劲…另外,我认为对 x_hat 的求导是错误的,因为它不仅需要与 D 交换空间,而且 D 必须被转置。
Image from this website
如上所述,当方程为 y = Ax 时,我们对 x 求导,得到转置(A)。
Image from this website
此外,我发现了一些奇怪的事情,正如上面所看到的,作者实际上使用了奇异值分解来寻找特征值和向量。(在他们的实现中)。然而,没有提到使用奇异值分解,而是特征值分解。
Image from the paper
之所以引起我的注意,是因为关于 svd 的导数和特征值分解是不同的。(上图是 svd 的导数,下图是特征值分解。)我觉得这些有点奇怪。
Image from this paper
Image from this paper
最后,符号非常混乱,如下图所示,蓝色区域矩阵是一个元素乘法,但是没有任何符号指定这个操作。(我以为是⊙,*或者∘)。
上面的例子非常混乱,但是这是一个简单的例子,我展示了我们必须执行元素乘法而不是点积。我对作者没有负面的感觉,但是我很惊讶 CVPR 最负盛名的计算机视觉会议论文之一竟然有这些错误。我完全承认我有可能用不同的符号错了,或者仅仅是我的错误。
我应该用特征值分解还是奇异值分解?
Image from this website
如上所述,即使 Andrew NG 也喜欢使用 svd,因为它在数值上更稳定。另外,看到下面的回答…
Image from this website
我们知道,SVD 不仅更稳定,而且更快,此外,对输入的导数(没有对 U 或 V 的梯度)。反向传播稍微容易一些。
Image from this website
然而,似乎有些衍生产品还没有得到完全的支持。
Image from this website
但是我认为我们不应该仅仅使用 svd 来进行特征值分解。虽然 svd 确实更灵敏,但并不总是更快。
image from this website
image from this website
所以看起来没有明显的赢家…我个人更喜欢特征值分解,因为我更了解它。另外作为旁注,目前(2018 . 8 . 29)tensor flow 中特征值分解和奇异值分解都相当慢。
最后的话
(以下是我的个人笔记,如果需要可以跳过。)
我会用这一部分为我未来的自己做一个笔记,关于我理解有困难的部分。在通过批处理规范化的反向传播过程中,有一个术语神秘消失了。(如下图。).
Image from this website
起初可能会令人困惑,但事实证明非常简单,在我们继续之前,让我们回顾一些西格玛规则,可以在这里找到。
Image from this website
啊,所以,如果第二项“b”不是矩阵,(或者与 sigma 符号无关),我们可以认为第二项只是重复次数(N)和原始值“b”的乘积。这就是为什么在批处理范数中,平均向量(mu)不会被(1/m)除,因为我们要乘以它。记住,mu 是相对于行的向量。(如在中,我们将矩阵设置为 ND,其中 N 是示例的数量,D 是维度,mu 正好是(1D))。或者我们也可以把它想成类似下图的东西。
Image from this website
简单回顾一下软 Max 与交叉熵损失
Image from this website
我不喜欢依赖高级 api 的原因之一是,我忘记了如何实现其中的一些。(尴尬但是挺真实的。).如上所述,多标签损失包括两项,软最大层和交叉熵损失。软最大值很容易,只需归一化给定的向量,使总和为 1,但是我们需要注意数值稳定性。
Image from this website
如上所述,减去最大值是个好主意,但不是全局最大值,而是每个向量的最大值。(ND)然后是(N1)个最大值。
Image from this website
Image from this website
如上所述,在计算预测成本时,我们忽略了平均值或总值。最后,我希望提醒自己关于实现的危险,如下所示,实现可能看起来是正确的(确实如此)。
Image from this website
然而,上面的实现对 2D 矩阵实现不起作用,如果我们有最终预测矩阵为(N*D ),其中 N 是例子的数量,D 是最终预测,则必须使用下面的实现。
最后,以防万一矩阵的一些基本概念,和一个矩阵演算的 pdf。和批量标准化的完全反向传播。
Image from this website
Final resource for back prop in BN, from here
Paper from this website
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你希望看到我所有写作的列表,请在这里查看我的网站。
同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。我也实现了广残网,请点击这里查看博文 pos t。
参考
- NumPy . linalg . EIG—NumPy 1.15 版手册。(2018).Docs.scipy.org。检索于 2018 年 8 月 19 日,来自https://docs . scipy . org/doc/numpy/reference/generated/numpy . Lina LG . EIG . html
- 熊猫,C. (2018)。与熊猫相关矩阵的计算及可视化。数据科学堆栈交换。检索于 2018 年 8 月 19 日,来自https://data science . stack exchange . com/questions/10459/computation-and-visualization-of-correlation-matrix-with-pandas
- NumPy . cov—NumPy 1.15 版手册。(2018).Docs.scipy.org。检索于 2018 年 8 月 19 日,来自https://docs . scipy . org/doc/numpy/reference/generated/numpy . cov . html
- 统计白化。(2018).joelouismmarino . github . io .检索于 2018 年 8 月 19 日,来自http://joelouismmarino . github . io/blog _ posts/blog _ whitening . html
- 内联,H. (2018)。如何让 IPython 笔记本 matplotlib 内联绘图?堆栈溢出。检索于 2018 年 8 月 20 日,来自https://stack overflow . com/questions/19410042/how-to-make-ipython-notebook-matplotlib-plot-inline
- matplotlib?,H. (2018)。如何改变用 matplotlib 绘制的图形的大小?。堆栈溢出。检索于 2018 年 8 月 20 日,来自https://stack overflow . com/questions/332289/how-do-you-change-the-size-of-figures-drawn-with-matplotlib
- 随机抽样(numpy.random) — NumPy v1.14 手册。(2018).Docs.scipy.org。检索于 2018 年 8 月 20 日,来自https://docs . scipy . org/doc/numpy-1 . 14 . 0/reference/routines . random . html
- sk learn . datasets . make _ regression-sci kit-learn 0 . 19 . 2 文档。(2018).Scikit-learn.org。检索于 2018 年 8 月 20 日,来自http://sci kit-learn . org/stable/modules/generated/sk learn . datasets . make _ regression . html # sk learn . datasets . make _ regression
- j . brown lee(2018 年)。如何用 scikit-learn 在 Python 中生成测试数据集?机器学习精通。检索于 2018 年 8 月 20 日,来自https://machine learning mastery . com/generate-test-datasets-python-sci kit-learn/
- 美白?,W. (2018)。ZCA 美白和 PCA 美白有什么区别?。交叉验证。检索于 2018 年 8 月 20 日,来自https://stats . stack exchange . com/questions/117427/zca-whiting-and-PCA-whiting 的区别是什么
- 协方差矩阵和数据分布。(2013).聪明的机器。2018 年 8 月 20 日检索,来自https://theclevermachine . WordPress . com/2013/03/29/协方差矩阵和数据分布/
- 内联,H. (2018)。如何让 IPython 笔记本 matplotlib 内联绘图?堆栈溢出。检索于 2018 年 8 月 21 日,来自https://stack overflow . com/questions/19410042/how-to-make-ipython-notebook-matplotlib-plot-inline
- 使用 matplotlib (pylab)并排显示两幅图像。(2018).要点。检索于 2018 年 8 月 21 日,来自https://gist . github . com/mstankie/71e 49 f 628 beac 320953 e 0460 b 8e 78 c 2
- 在西马特普罗提卜(2018)。在 Matplotlib 中,fig.add_subplot(111)中的参数是什么意思?。堆栈溢出。检索于 2018 年 8 月 21 日,来自https://stack overflow . com/questions/3584805/in-matplotlib-what-the-argument-mean-in-fig-add-subplot 111
- 推导批次标准化的后向传递的梯度。(2018).kevinzakka . github . io . 2018 年 8 月 21 日检索,来自https://kevinzakka . github . io/2016/09/14/batch _ normalization/
- 符号:在求和或乘积的周围放括号,w. (2018)。符号:求和或乘积的括号在哪里,约定是什么?。数学栈交换。检索于 2018 年 8 月 21 日,来自https://math . stack exchange . com/questions/2348132/notation-where-to-put-brackets-around-summation-or-product-what-the-convent
- 高效批次标准化-佩德罗·科斯塔。(2018).Costapt.github.io,检索日期:2018 年 8 月 21 日,自https://costapt.github.io/2016/07/09/batch-norm-alt/
- umich-VL/de related bn。(2018).GitHub。检索日期:2018 年 8 月 21 日,自https://git hub . com/umich-VL/decorated bn/blob/master/module/decorated bn _ advance . Lua
- (2018).Arxiv.org。检索于 2018 年 8 月 21 日,来自https://arxiv.org/pdf/1509.07838.pdf
- (2018).Colorado.edu。检索日期:2018 年 8 月 21 日,来自https://www . Colorado . edu/engineering/CAS/courses . d/ifem . d/IFEM。AppC.d/IFEM。AppC.pdf
- 居中。(2018).Cis.legacy.ics.tkk.fi .检索自 2018 年 8 月 21 日http://cis . legacy . ics . tkk . fi/aapo/papers/Ijcnn 99 _ tutorialWeb/node 25 . html
- CVPR2018。(2018).Cvpr2018.thecvf.com。检索自 2018 年 8 月 21 日,http://cvpr2018.thecvf.com/
- 扩展 SVD 梯度以支持通过复杂和(强)矩形 U 和 V 的反向传播问题#13641 张量流/张量流。(2018).GitHub。检索自 2018 年 8 月 21 日,https://github.com/tensorflow/tensorflow/issues/13641
- PCA?,W. (2018)。为什么吴恩达更喜欢用奇异值分解而不是协方差矩阵的 EIG 来进行 PCA?。交叉验证。检索日期:2018 年 8 月 21 日,自https://stats . stackexchange . com/questions/314046/为什么-andrew-ng 更喜欢-SVD-而不是-EIG-of-协方差矩阵-to-PCA
- PCA?,W. (2018)。为什么吴恩达更喜欢用奇异值分解而不是协方差矩阵的 EIG 来进行 PCA?。交叉验证。检索日期:2018 年 8 月 21 日,自https://stats . stackexchange . com/questions/314046/为什么-andrew-ng 更喜欢-SVD-而不是-EIG-of-协方差矩阵-to-PCA
- 达哈尔,P. (2017 年)。分类和损失评估— Softmax 和交叉熵损失。深度笔记。检索于 2018 年 8 月 22 日,来自https://deepnotes.io/softmax-crossentropy
- [在线]见:https://www . quora . com/Is-the-soft max-loss-the-same-as-the-cross-entropy-loss[2018 年 8 月 22 日访问]。
- 对深层神经网络的归纳。(2018).ritchieng . github . io . 2018 年 8 月 22 日检索,来自https://www . ritchieng . com/machine-learning/deep-learning/neural-nets/
- 第 2 部分:Softmax 回归。(2018).Saitcelebi.com。检索于 2018 年 8 月 22 日,来自http://saitcelebi.com/tut/output/part2.html
- JaeDukSeo/个人 _ 日常 _ 神经网络 _ 实践。(2018).GitHub。检索于 2018 年 8 月 22 日,来自https://github . com/JaeDukSeo/Personal _ Daily _ neural network _ Practice/blob/master/a _ vgg/1 _ mini _ vgg _ 16 . py
- \frac{1}{1+e^{-x}} 特区 ( 2018 年 ) 。 s i g m o i d 函数的导数 特区(2018 年)。sigmoid 函数的导数 特区(2018年)。sigmoid函数的导数\sigma (x) = \frac{1}{1+e^{-x}}$.数学栈交换。检索于 2018 年 8 月 22 日,来自https://math . stack exchange . com/questions/78575/derivative-of-sigmoid-function-sigma-x-frac 11 e-x
- Python,H. (2018)。如何用 Python 实现 Softmax 函数?堆栈溢出。检索于 2018 年 8 月 22 日,来自https://stack overflow . com/questions/34968722/how-to-implementation-the-soft max-function-in-python
- 在 Python,c. (2018)。在 Python 中,使用 numpy 按列计算数组的 softmax。堆栈溢出。检索于 2018 年 8 月 22 日,来自https://stack overflow . com/questions/36738754/in-python-calculate-the-soft max-of-an-array-column-wise-using-numpy
- 行与列——谷歌搜索。(2018).Google.co.kr。检索 2018 年 8 月 22 日,来自https://www.google.co.kr/search?q=row+vs+column&OQ = row+vs+col&aqs = chrome . 1.69 i57 j0l 5.3550 j0j 7&sourceid = chrome&ie = UTF-8
- 无,N. (2018)。Numpy fill_diagonal return 无。堆栈溢出。检索于 2018 年 8 月 22 日,来自https://stack overflow . com/questions/46445894/numpy-fill-diagonal-return-none
- numpy.fill_diagonal — NumPy v1.14 手册。(2018).Docs.scipy.org。检索于 2018 年 8 月 22 日,来自https://docs . scipy . org/doc/numpy-1 . 14 . 0/reference/generated/numpy . fill _ diagonal . html
- 已实施?,H. (2018)。numpy.cov()函数是如何实现的?。堆栈溢出。检索于 2018 年 8 月 23 日,来自https://stack overflow . com/questions/27448352/how-numpy-cov-function-is-implemented
- Python,H. (2018)。如何使用 Python 并排绘制两个图?堆栈溢出。检索于 2018 年 8 月 23 日,来自https://stack overflow . com/questions/42818361/how-to-make-two-plots-side-by-side-using-python
- NumPy . STD—NumPy 1.15 版手册。(2018).Docs.scipy.org。检索于 2018 年 8 月 25 日,来自https://docs . scipy . org/doc/numpy/reference/generated/numpy . STD . html
- Convnet:用 Numpy 实现卷积层— Agustinus Kristiadi 的博客。(2018).wise odd . github . io . 2018 年 8 月 26 日检索,来自https://wise odd . github . io/tech blog/2016/07/16/conv net-conv-layer/
- wiseodd/hipsternet。(2018).GitHub。检索于 2018 年 8 月 26 日,来自https://github . com/wise odd/hipsternet/blob/master/hipsternet/layer . py
- день二号,лекция四号。Евгений Соколов.Регуляризация нейронных сетей.(2018).YouTube。检索于 2018 年 8 月 26 日,来自https://www.youtube.com/watch?v=Zz98nDE5b8E
- (2018).Colorado.edu。检索于 2018 年 8 月 27 日,来自https://www . Colorado . edu/engineering/CAS/courses . d/ifem . d/IFEM。AppC.d/IFEM。AppC.pdf
- [复本],H. (2018)。如何在一个图中正确显示多个图像?。堆栈溢出。检索于 2018 年 8 月 29 日,来自https://stack overflow . com/questions/46615554/how-to-display-multiple-images-in-one-figure-right
只有 Numpy:卷积更新门 RNN,用交互代码修改谷歌大脑的更新门 RNN(递归神经网络中的容量和可训练性)。
Gif from here
因此,我在这里发表了一篇文章,实现了本文中提出的各种不同的 RNN “递归神经网络的容量和可训练性”,请点击这里的链接阅读我的中型博客文章。但是为什么就此打住呢?
让我们将更新门 RNN (URNN)转换为 CURNN,卷积更新 RNN。此外,我将使用动量优化器。我们正在对仅用于 0 和 1 图像的“识别手写数字”数据集执行一个非常简单的二进制任务。
热门人工智能文章:
网络架构:数学形式
Image from Original Paper
上面的图像只是一个复习,但是请注意红色的星形区域,我们将把这个操作从点积改为卷积操作。
网络架构:图形形式/前馈操作
上图中有很多东西,所以让我从最右边解释一下。
浅绿色框 → 零填充隐藏状态以保留尺寸( 注意这一点非常重要,因为我们需要保留尺寸! )
X →尺寸为(88)
Wxg,Wxc →将要应用于尺寸为(55)的输入图像的卷积核
g(t),c(t),h(t) →各门输出,尺寸均为(4*4)
Wrecc,Wrecg →将要应用于先前隐藏状态维度(3*3)的卷积核
Wfc1,Wfc2 →分类全连接层的权重
橙色框 →我和 CURNN 的前馈假设有 2 个时间戳
紫色方框 →对于两个时间戳来说,输入是完全相同的图像!(所以我的想法是,网络可以通过再次显示相同的图像来学习得更好,LOL 不知道这是否可能是真的。)
蓝框 →矢量化隐藏状态(2)矩阵(44)成(116)矢量。
下面是代码实现。
关于
Wfc2,Wfc1,c(2) —时间戳= 2,g(1) —时间戳= 1 的反向传播
再一次,这张图片包含了很多东西。
粉色星形/红色星形→ 全连接层的标准反向传播尊重 Wfc1、Wfc2
蓝星 →时间标记 2 时相对于 c 门()的导数。请注意,我们对 c()求导,而不是对权重 Wrecc 或 Wxc 求导,这是因为一旦我们对 c()求导,我们就可以很容易地对这些变量进行反向传播。如果你想看 RNN 反向传播的完整例子。请通过点击此处或点击此处阅读我的中帖。
粉色星星 →故事同上,但针对 g 门(),时间标记为 1。
下面是反向传播的局部视图。
培训和结果
在使用超级参数后,(ALOT)我能够取得不错的成绩。然而,这是非常困难的训练。在一些点上,学习只是停止在成本 44 或类似的东西,所以它是相当令人沮丧的。
互动码
注意:在线编译器没有“从 sklearn 导入数据集”,所以我不能复制并粘贴我在笔记本电脑上使用的代码。所以我复制了四个训练样本,分别代表手写数字 0,1,0,1,并调整了超参数。
更新:我为了交互代码搬到了 Google Colab!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
最后的话
我真的需要使用不同的优化方法。在纯 SGD 或 Momentum 上训练复杂模型变得有点困难。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。
同时,在我的 twitter 上关注我这里,访问我的网站,或者我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考文献
- Collins,j .,Sohl-Dickstein,j .,和 Sussillo,D. (2016 年)。递归神经网络的容量和可训练性。 arXiv 预印本 arXiv:1611.09913 。
- Seo,J. D. (2018 年 1 月 24 日)。Only Numpy:实现和比较 Google Brain 的更新门(容量和可训练性 in…2018 年 1 月 29 日检索,来自https://becoming human . ai/only-Numpy-Implementing-and-comparison-Google-brains-Update-Gate-Capacity-and-training ability-in-940 f0ad 80649
- Seo,J. D. (2018 年 1 月 11 日)。只有 Numpy:推导长期短期记忆中的前馈和反向传播(LSTM)第 1 部分。2018 年 1 月 29 日检索,来自https://medium . com/@ SeoJaeDuk/only-numpy-derivating-forward-feed-and-back-propagation-in-long-short-term-memory-lstm-part-1-4 ee 82 c 14 a 652
- Seo,J. D. (2018 年 1 月 29 日)。Only Numpy:(我为什么做手动反向传播)实现多通道/层卷积神经…2018 年 1 月 29 日检索自https://medium . com/@ SeoJaeDuk/only-Numpy-Why-I-do-Manual-Back-Propagation-Implementing-Multi-Channel-Layer-con { volution-Neural-7d 83242 FCC 24
只有 Numpy:解耦卷积 LSTM 分类小狗 gif 和婴儿 gif 与互动代码。
在继续阅读之前,请注意这是实验模型,我只是想挑战自己来建造这个模型。因此,在反向传播过程中存在一些错误的可能性很高。我会回来这个帖子确认这件事。还有,本帖所有的 GIF 都来自 GIPHY 。
Corgy Image from Pixel Bay
LSTM 很难训练,不使用框架更难实现。在我看来,原因在于,我们需要求解大量的方程,才能得到不同时间标记中每个权重的梯度。在对 GRU 执行反向传播时,我意识到我们需要多少个方程才能得到时间戳 1 中一个权重的梯度。
实际上,我们需要的方程的数量相对于每一层的循环连接的数量呈指数增长。所以在 LSTM 的例子中,所需方程的数量增长了……
4^n where n is the time stamp going in back wards direction
此外,如果我们获得不同时间戳层的成本,而不仅仅是最外层的成本,还要加上 alpha。请在这里看看我关于在 lstm 上执行前馈和反向传播操作的博文。
然而,有一种方法可以减少我们需要的方程数量,那就是使用解耦神经网络架构。使用这种方法,我们可以打破链式法则,有点……
记住这一点,让我解释一下我想做什么。此外,如果你不熟悉 LSTM,请查看 Colah 的 Blo
数据集(GIF 图像)—训练数据
以上是训练数据的小狗部分,我们将它们标记为 1。另外,所有的 GIF 图片都被调整为 100*100 像素,并且只包含 3 帧。所以我们总共有 18 帧。
以上是训练数据的婴儿部分,我们将它们标记为 0。同样,所有的 GIF 都被调整为 100*100 像素,并且只包含 3 帧。所以我们总共有 36 帧,包括小狗和婴儿的 gif。
数据集(GIF 图像)—测试数据
如上所述,我们有 4 个 GIF 作为测试数据,所有这些都被调整为 100*100 像素,只包含 3 帧。所以我们总共有 12 帧。
网络架构(图形形式)
橙色框 →时间戳甲骨文框 1
红色框 →时间戳甲骨文框 2
蓝色框 →时间戳甲骨文框 3
紫框→LSTM 的最终输出,这个值将连接到一个全连接的神经网络,用于预测给定的 GIF 是小狗 GIF 还是婴儿 GIF。
黑盒 →每个时间戳的输入帧,因为每个 GIF 有 3 帧,所以我们有 3 个时间戳。
因此,使用每个时间戳中的 oracle box,我们可以立即更新我们的权重。另一件需要注意的事情是,我使用了 OOP 方法来实现每一层,所以每一层都是一个类。我是通过 iamtrask 的解耦神经网络教程得到这个灵感的。
每一层都有三个功能。
a .初始化 →创建层合成权重的地方
b .前馈合成更新 →执行标准前馈操作并使用合成梯度更新权重
c .合成权重更新 →使用从下一层传播的梯度更新每一层的合成梯度。
基于这种理解,我将通过截图来“尝试”描述每个操作。
解耦 LSTM 层:前馈操作
以上是每一层的前馈过程,正如你所见,这是 LSTM 层的标准前馈操作。这里我们有 4 个门,遗忘,输入,单元和输出。每个门具有不同的激活功能。
去耦 LSTM 层:使用合成渐变进行渐变更新
红色下划线 →使用合成梯度计算误差率
蓝框 →使用计算的误差率更新循环权重。
因此,如上所述,我们现在能够在完成前馈操作后立即更新递归权重。
分离的 LSTM 层:传递渐变到前一层
红色下划线 →使用更新的递归权重,我们正在计算将传递给前一层的渐变。
现在这个操作只适用于第一层之后的层,因为我们没有第 0 层。然而,因为我们使用面向对象的方法,甚至第 1 层将执行这个操作。但是我们不会存储返回的变量,如下图所示。
粉色方框 →忽略从第 1 层返回的通过梯度
黄色下划线 →存储从第 2 层返回的通过梯度,并将其交给第 1 层进行合成梯度更新。
去耦 LSTM 层:合成渐变更新
蓝色框 →更新遗忘门的合成权重
粉色框 →更新输入门的合成权重
绿色框 →更新单元门的合成权重
紫色框 →更新输出门的合成权重
因此,每一层都将使用从下一层传递来的渐变来更新它们的合成权重。
全连接层
还有最后一部分我还没讲,就是全连接层。
红框→LSTM 最终输出矢量化
蓝框 →全连接层标准前馈运算和 L2 范数代价函数
绿框 →全连接层标准反向传播。
训练和结果
以上是训练的成本,它首先从 0.39 开始,在最后一个时期下降到 0.011。(我训练了 18 个纪元。)
红框 →训练前模型对测试集的预测
蓝框 →训练后模型对测试集的预测
黑色下划线数字 →模型置信度如何变化
以上是模型对给定 GIF 是小狗 GIF(表示为 1)还是婴儿 GIF(表示为 0)的预测。现在很公平地说,我只有 4 个训练 GIF,其中三个甚至在训练前就被正确预测了。然而,我关注的不是准确性,而是其他东西。
请看看黑色下划线的数字,这是我所关注的。似乎这个模型已经学会了一些特性(我不知道是什么)。)这使得它能够更有把握地决定给定的 GIF 是否属于一个类别。
交互代码
为了交互代码,我搬到了 Google Colab!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
现在运行这段代码有点复杂,因为我使用了自己的数据集。不过不要担心,我已经把我用过的所有 GIF 上传到我的公共 Gitlab,要访问它请点击这个链接。要访问知识库的主页,请点击此处。现在请按照一步一步的教程。
- 从上面的链接下载“datasmall.zip”文件。其中当然包含一种致命的电脑病毒😈。
2.将 Google Colab 中的代码复制到您自己的游戏中。运行代码时,会弹出一个小按钮,如上所示。(绿色方框)。单击“选择文件”并选择最近下载的“datasmall.zip”文件。
3.该计划将完成上传数据到谷歌 Colab,它将继续运行。
所以记住上面的简短教程,请点击这里访问交互代码。
遗言
使用这种去耦架构,可以实现深度超过 3 层的 LSTM 网络。此外,我开始了一个新的系列,我将重新审视我过去的所有帖子,并反复检查我是否正确地实现了所有内容。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。
同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考
- 了解 LSTM 网络。(未注明)。检索于 2018 年 2 月 10 日,来自http://colah.github.io/posts/2015-08-Understanding-LSTMs/
- Seo,J. D. (2018 年 1 月 15 日)。Only Numpy:衍生门控递归神经网络中的前馈和反向传播(GRU)-…2018 年 2 月 10 日检索,来自https://medium . com/@ SeoJaeDuk/only-Numpy-derivating-Forward-feed-and-Back-Propagation-in-Gated-Recurrent-Neural-Networks-gru-8b 6810 f 91 bad
- Seo,J. D. (2018 年 1 月 11 日)。只有 Numpy:推导长期短期记忆中的前馈和反向传播(LSTM)第 1 部分。2018 年 2 月 10 日检索,来自https://becoming human . ai/only-numpy-derivating-forward-feed-and-back-propagation-in-long-short-term-memory-lstm-part-1-4ee 82 c 14 a 652
- 贾德伯格,m .,Czarnecki,W. M .,奥辛德罗,s .,维尼亚尔斯,o .,格雷夫斯,a .,& Kavukcuoglu,K. (2016)。使用合成梯度的去耦神经接口。 arXiv 预印本 arXiv:1608.05343 。
- G.(未注明)。搜索所有的 GIF &制作你自己的动画 GIF。检索于 2018 年 2 月 10 日,来自https://giphy.com/
- 没有反向传播的深度学习。(未注明)。检索于 2018 年 2 月 10 日,来自https://iamtrask.github.io/2017/03/21/synthetic-gradients/
只有数字:长期短期记忆中的前向反馈和反向传播(LSTM)第 1 部分
所以我从我的韩国寒假旅行回来了。(南方)。实际上,我想在去度假之前做这件事,但不管怎样,还是这样吧。此外,我将把本教程分为两部分,因为反向传播变得相当长。我将使用数学符号
今天我们将对 LSTM(长短期记忆)网络进行前馈操作和反向传播,所以让我们先看看网络架构。
网络体系结构
Network Architecture
如上所述,我需要解释的符号很少。
F(k) - >时间戳处的遗忘门
I(k) - >时间戳处的输入门
A(k)- >时间戳处的激活门
O(k)- >时间戳处的输出门
S(k)- >时间戳处的状态
Out(k) - >时间戳处的输出
另一件要注意的事情是正常体重和经常性体重。输入 X 使用常规权重 W 执行点积,而先前的输出使用递归权重 Wrec 执行点积。所以总共有 8 个权重,特别是在执行反向传播时,注意这一点很重要。
热门人工智能文章:
浅绿色框->成本函数,我们正在使用 L2 成本函数
黄色框与下图所示的一个框相同。
Image from colah’s blog
前馈过程
如上所述,LSTM 的前馈过程非常简单,我们唯一要小心的是时间戳。上图显示了 TS 为 1 和 TS 为 2 时,两个时间戳的前馈过程。
另一件要注意的事情是每个时间戳的成本函数,我们可以看到我们得到了每个时间戳的错误率。
1/2 *(Out(1)-Y(1))→TS = 1
1/2 *(Out(2)-Y(2))→TS = 2
时间戳为 2 时所有权重的反向传播
记得我告诉过你我们总共有 8 个砝码吗?(包括常规的和循环的)现在我们需要对它们中的每一个进行反向传播,这就是为什么我们在板上有 8 个方程。
等式 1 →关于 Wo(输出门)的权重更新
等式 2→关于 Wreco(循环输出门)的权重更新
等式 3→关于 Wa(激活门)的权重更新
等式 4→关于 Wreca(循环激活门)的权重更新
等式 5→关于 Wi(输入门)的权重更新
等式 6→关于 Wreci(循环输入门)的权重更新
等式 7→关于 Wf(遗忘门)的权重更新
等式 8→关于 Wrecf(循环遗忘门)的权重更新
Closer Look for Wo, Wreco, Wa and Wreca
如上所示,数学术语写在上面,实际的反向传播写在底部。(关于每个术语)。
Closer Look for Wi, Wreci, Wf and Wrecf
时间戳为 1 时相对于 Wo(输出门)的反向传播
正如你已经注意到的,由于链式法则,当时间戳为 1 时,反向传播变得非常复杂。你在上面看到的这五个方程,只是为了得到相对于 Wo 的误差率。
当时间戳为 1 时,关于执行反向传播的一个有趣事实是总错误率。我们不仅需要考虑时间戳为 1 时代价函数的错误率,还需要考虑时间戳为 2 时代价函数的错误率。所以…
蓝框→时间戳为 1 时成本函数的错误率
绿框→时间戳为 2 时成本函数的错误率
上面是执行反向传播所需的实际数学方程的屏幕截图。我想指出两件事。
- 我们正在乘以递归权重以执行反向传播的黑星→这就是为什么 LSTM 如此难以训练的原因,它们非常容易受到梯度爆炸和消失梯度的影响。
- 如上图所示,红框内的数学符号是重复的术语。在未来,我将通过首先计算重复项来简化反向传播。
最后的话
这是第一部分,我会很快给你们第二部分和第三部分的更新…(我希望如此)。
同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还在简单的 RNN 上做了反向传播。
Only Numpy:通过“使用空间 LSTMs 的生成图像建模”导出多维递归神经网络(空间 LSTM)的前馈
多维递归神经网络,我一听到它的名字就对它产生了兴趣。所以今天,我将尝试针对空间 LSTM 的网络结构介绍。“使用空间 LSTMs 的生成式图像建模”Lucas Theis。同样在今天的博客中,我们将对 2D·LSTM 进行前馈。
我还买了一个新的马克笔——橙色和绿色的 XD
从 1D LSTM 转换到 2D LSTM
上面的图片展示了我们如何把 1D·LSTM 的想法带到 2D·LSTM。将它们应用到图像上。从上面的照片中需要注意的非常重要的一点是单元格状态和隐藏状态。
黄色方框→ 1D LSTM
绿色方框→转置的 1D LSTM
(把它想象成矩阵中的一列)
粉色方框→ 2D LSTM
1D LSTM that depends on Time
如上所述,对于 1D·LSTM,我们在开始训练网络之前初始化 C(0)和 h(0)。有多种方法来初始化这些值,例如在论文“ Show,Attend and Tell:Neural Image Caption Generation with Visual Attention”中,作者通过称为 MLP 的东西来初始化第一个值——我只能假设它是多层感知器。
Image from original Paper Show, Attend and Tell: Neural Image Caption Generation with Visual Attention
但是在 2D LSTM,我们必须初始化更多的单元格和隐藏状态值。
2D LSTM respect to time
如上所示,我们不仅需要从 C(0,1)初始化到 C(0,j),还需要从 C(1,0)初始化到 C(i,0)。所有隐藏状态都是如此。现在我们可以做一些有趣的事情,因为我们知道了 1D·LSTM 和 2D·LSTM 的结构,让我们想象一下 3D LSTM。
3D LSTM
她真是个美人,不是吗?😄
同样,橙色方框是第一个单元格和隐藏状态的位置。这个网络的应用不仅仅局限于视频数据,还有更多。现在我们知道了一般的结构,让我们回到论文“使用空间 LSTMs 生成图像建模
空间长短期记忆
Image from original paper
所以正如作者所说,最初的 SLSTM 是由两位作者 Graves & Schmidhuber 提出的。要查看这两位作者的论文,请单击“”使用多维递归神经网络进行脱机手写识别。在那篇论文中,作者对什么是 2D·LSTM 有一个很好的设想,如下所示。然而,我正在研究的论文有更清晰的数学方程来描述 SLSTM。(如上所示)
Image from paper Offline Handwriting Recognition with Multidimensional Recurrent Neural Networks
样本训练数据
因此,我们将对一个非常简单的训练数据进行前馈传递,这是一个尺寸为 22(总共 4 个像素)的图像,如上面的黑框所示。*
网络架构
现在我知道它看起来不好,但我不得不使用整个白板来制作图表 LOL 所以在这里和我一起工作。让我们从头开始。
首先每个盒子代表一个 LSTM 盒子,建筑是从著名的 Colah 博客衍生而来。
Image from Colah Blog
其次,下面是时间戳信息。
红框→时间戳为(1,1)时进给
绿框→时间戳为(2,1)时进给
橙框→时间戳为(1,2)时进给
紫框→时间戳为(2,2)时进给
第三,每个蓝星代表我们在每个时间戳可以计算的成本函数。
向前进给
再说一次,我知道这看起来很糟糕,但是对于 LSTM 方程来说,它总是很混乱。
需要注意的是,所有用蓝色标记写的变量都是已经初始化的值。所以不要担心它们是从哪里冒出来的,它们是事先被初始化的。
Detailed Look at Forward Feed at Time Stamp (1,1) and (1,2)
Detailed Look at Forward Feed at Time Stamp (2,1) and (2,2)
最后的话
我无法想象这个网络的反向传播过程,用手来推导它们会很有趣。我希望有一天会这样做。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。
同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还在简单的 RNN 上做了反向传播。
参考文献
- Theis,l .,& Bethge,M. (2015 年)。使用空间 LSTMs 的生成式图像建模。在神经信息处理系统的进展*(1927-1935 页)。*
- 更正,abs/1502.03044,。许凯文和(2015)。展示、参与和讲述:视觉神经图像字幕生成。
- 更正,abs/0705.2011,。亚历克斯·格雷夫斯和(2007)。多维递归神经网络。
- 了解 LSTM 网络。(未注明)。检索于 2018 年 1 月 19 日,来自http://colah.github.io/posts/2015-08-Understanding-LSTMs/
- Graves,a .,& Schmidhuber,J. (2009)。基于多维递归神经网络的脱机手写识别。在神经信息处理系统的进展*(第 545–552 页)。*
[仅适用于 Numpy ]在 Numpy 中使用交互式代码体验特征值/向量的乐趣
GIF from this website
主成分分析、奇异值分解和独立成分分析都是降维技术。它们都依赖于特征值和向量。今天,我想超越高级 API,进入细节。
请注意,这篇文章纯粹是我自己在解释这些概念,所以这篇文章可能会有点不同。
为什么我们甚至需要特征向量/值?(这部分是垃圾)
Image from this website
我们实际上可以把每一个矩阵,甚至病历 csv 看作一个转换矩阵。我思考这个问题的方式有点奇怪,例如,我们可以有如下所示的一些数据。
Data from Sklearn Wine
数据集用于分类任务,因此有一个目标值未显示在上面的矩阵中。但是当我们为上述数据绘制 2D 散点图时,我们可以得到如下结果。
如上所述,我们可以将每个数据点视为基向量的变换。(即稀释葡萄酒的[1,0]o d280/o d315 或黄酮类化合物的[0,1]。).
协方差矩阵/相关矩阵
Image from this website
在继续之前,理解协方差和相关矩阵的概念是必要的。因此,请花几分钟时间查看这些材料。如果你想看这些东西的数字计算方法,请点击这里。
改变基本向量/样本数据的示例
让我们做一些非常简单的事情,红点代表给定的两个蓝色数据点的特征值。让我们将该值设置为新的基本向量,并投影两个蓝色数据点。
如上所示,我们可以看到,现在我们的数据已经翻转。如果你希望看到如何实现这一点的代码,请见下文。
现在,让我们来看看我们将要使用的数据集。
Data from Sklearn Wine
您已经看到了上面的图表,因为我们将使用来自 sklearn 的葡萄酒数据集。但是,我们不会使用所有维度,而是只使用两个最相关的属性。
使用协方差矩阵改变基数
左图 →使用 Numpy
计算的协方差矩阵右图 →使用内置函数计算的协方差矩阵
首先,我们需要计算协方差矩阵,从这里我们可以得到生成的协方差矩阵的特征向量和值。(这是原理变化向量。)
红点 →协方差矩阵的特征向量
如上所示,在得到每个向量后,我们可以画一个线性图,线的长度并不重要。但是我们可以看到,最大差异存在的区域是数据点的对角线。
最后,我们可以将所有的数据点投影到这个基向量中。不幸的是,我们丢失了属性信息。然而,我们能够看到更清晰的数据版本。
使用相关矩阵改变基础
左图 →使用 Numpy
计算相关矩阵右图 →使用内置函数计算相关矩阵
现在我知道颜色是关闭的,但值是一样的,如下所示。
和上次一样,让我们找出这个矩阵的特征向量。
得到的向量彼此对称,相关矩阵本身也是对称的。
然而,以上是当我们使用从相关矩阵生成的特征向量时得到的投影。
奇异值分解(2D)
既然我们已经走了这么远,让我们走得更远。我们可以很容易地执行奇异值分解。如上所述,在首先计算转置(A)点积(A)之后。我们可以找到那个矩阵的特征向量。从那里我们可以得到我们的 u,最后,如上面红框所示,我们可以观察到,原始矩阵和重构矩阵之间没有区别。(如果你不明白这个方法请点击这里。)
现在让我们去掉最不重要的奇异值,进行降维。正如上面所看到的,我们可以清楚地看到,重建的矩阵与原始矩阵并不相同。
当我们将数据投影到 2D 平面时,我们可以观察到,在 SVD 之后,对角线上的最大变化被捕获。
奇异值分解(3D)
最后,让我们以一些 3D 图来结束,如上所述,我添加了一个额外的属性,“alcalinity_of_ash”。
左图 →使用 Numpy
计算的协方差矩阵右图 →使用内置函数计算的协方差矩阵
再一次,让我们先看看,仅仅改变基底,我们能做什么。当我们根据协方差绘制生成的特征向量时,我们得到如下结果。
我稍微改变了起点,但故事保持不变。现在让我们执行投影。
我们可以观察到这样一个事实,现在我们的特征向量已经占据了基向量空间。现在它们都互相垂直。此外,我们还可以对 3D 数据执行 SVD。
就像前面的例子,我们可以看到,重建的矩阵是相同的原始矩阵。现在来降维。
当我们丢弃最不重要的奇异值时,我们的 3D 数据会折叠成一个平面。然而。我们仍然可以观察到这样一个事实,即数据彼此之间仍然是完全可以分离的。
但是,当我们丢弃两个奇异值时,我们可以清楚地看到,我们的数据不再是可分的,因为它折叠成了一条线。
交互代码
对于谷歌实验室,你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要获取这篇文章的代码,请点击这里。
最后的话
玩特征值/向量真的很有趣。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站。
同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。我还实现了广残网,请点击这里查看博文 pos t。
参考
- 特征值和特征向量在 3 分钟内|用一个有趣的类比解释。(2018).YouTube。检索于 2018 年 7 月 9 日,来自https://www.youtube.com/watch?v=5UjQVJu89_Q
- sk learn . datasets . load _ wine-sci kit-learn 0 . 19 . 1 文档。(2018).Scikit-learn.org。检索于 2018 年 7 月 9 日,来自http://sci kit-learn . org/stable/modules/generated/sk learn . datasets . load _ wine . html # sk learn . datasets . load _ wine
- numpy.linalg.inv — NumPy v1.14 手册。(2018).Docs.scipy.org。2018 年 7 月 9 日检索,来自https://docs . scipy . org/doc/numpy-1 . 14 . 0/reference/generated/numpy . Lina LG . inv . html
- 正确,e. (2018)。numpy.linalg.eig 创建的特征向量似乎不正确。堆栈溢出。检索于 2018 年 7 月 9 日,来自https://stack overflow . com/questions/32926861/特征向量-created-by-numpy-Lina LG-EIG-dont-seem-correct
- 矩阵的逆。(2018).Mathsisfun.com。检索于 2018 年 7 月 9 日,来自 https://www.mathsisfun.com/algebra/matrix-inverse.html
- matplotlib?,H. (2018)。如何改变用 matplotlib 绘制的图形的大小?。堆栈溢出。检索于 2018 年 7 月 9 日,来自https://stack overflow . com/questions/332289/how-do-you-change-the-size-of-figures-drawn-with-matplotlib
- 在 Numpy 中使用矩阵点积/具有交互代码的基的变化的简单分类。(2018).走向数据科学。2018 年 7 月 9 日检索,来自https://towardsdatascience . com/naive-class ification-using-matrix-dot-product-change-of-basis-with-interactive-code-in-numpy-4808 E5 aa 955 e
- seaborn . heat map-seaborn 0 . 8 . 1 文档。(2018).Seaborn.pydata.org。检索于 2018 年 7 月 9 日,来自https://seaborn.pydata.org/generated/seaborn.heatmap.html
- matplotlib,C. (2018 年)。用 matplotlib 改变 y 范围从 0 开始。堆栈溢出。2018 年 7 月 9 日检索,来自https://stack overflow . com/questions/22642511/change-y-range-to-start-from-0-with-matplotlib
- 价值?,H. (2018)。如何使用十进制范围()步长值?。堆栈溢出。检索于 2018 年 7 月 9 日,来自https://stack overflow . com/questions/477486/how-to-use-a-decimal-range-step-value
- (2018).Users.stat.umn.edu。检索于 2018 年 7 月 9 日,来自http://users.stat.umn.edu/~helwig/notes/datamat-Notes.pdf
- 颜色示例代码:colormaps _ reference . py—Matplotlib 2 . 0 . 2 文档。(2018).Matplotlib.org。检索于 2018 年 7 月 9 日,来自https://matplotlib . org/examples/color/colormaps _ reference . html
- 使用样式表自定义绘图— Matplotlib 1.5.3 文档。(2018).Matplotlib.org。检索于 2018 年 7 月 9 日,来自 https://matplotlib.org/users/style_sheets.html
- 奇异值分解教程:应用,例子,练习。(2017).统计和机器人。检索于 2018 年 7 月 10 日,来自https://blog . statsbot . co/singular-value-decomposition-tutorial-52c 695315254
Only Numpy:使用交互式代码实现和比较 Google Brain 的去耦神经接口(合成梯度)和 Google Brain 的梯度噪声的组合
所以我在想,Google Brain 发表了这篇论文“使用合成梯度去耦合神经接口”,它可以同时训练每一层。当执行反向传播时,网络架构以每层不依赖于下一层梯度的方式构建。(算是吧)。
而且他们还发表了这篇论文“添加梯度噪声提高了对非常深的网络的学习 s”。几天前我写了一篇博文,关于将高斯噪声添加到反向传播以使学习更快,现在让我们将这两个想法结合起来。
所以我们总共可以检查 4 个案例。
1 →纯神经网络
2 →解耦神经接口
3 →纯神经网络+高斯噪声
4 →解耦神经接口+高斯噪声
热门人工智能文章:
阅读前
我假设你们所有人都已经非常熟悉去耦神经接口和高斯噪声。如果没有,请点击下面的链接。
对于解耦的神经接口,请阅读来自 Trask 的这篇惊人的帖子。来自 m e LOL 的这篇并不令人印象深刻的博文。
对于高斯噪声,请阅读本博客。
免责声明
上面是我在 Trinket 上运行代码时得到的结果,下面是我在桌面上运行代码时得到的结果。
如图所示,分类结果的颜色存在差异。尽管我使用了相同的 np.random.seed()值,但结果还是略有不同。我不知道为什么会这样,但它确实存在,所以如果你知道为什么,请在下面评论。此外,我将使用我的笔记本电脑上的屏幕截图和东西的结果。
声明超参数和训练数据
如上所述,这是一个简单的分类任务,到处都有一些噪声。现在让我们创建权重变量并复制它们,以确保我们从相同的权重开始。
如上所示,总共有 18 个砝码。红框内的权重用于情况 2:解耦神经接口,蓝框内的权重用于情况 4:解耦神经接口+高斯噪声。
此外,请注意,对于分离的神经接口,我们不仅需要合成梯度的权重,还需要每层的权重,因此我们需要绿色框内的权重。
DNI 的网络架构
上面是一个可怕的网络架构,来自我的媒体帖子,它并不代表我们将要实现的网络,但它确实得到了解耦神经接口的一般结构。再次为更多的信息,请阅读我已经包括的链接。
纯神经网络和 DNI 的前馈
Forward Feed For Pure NN
Partial View for Forward Feed for DNI
标准的神经网络前馈过程是容易和简单的,没有更多的添加。但是对于 DNI 来说,这就有点复杂了,因为我们可以在完成前馈过程后立即对重量进行反向传播。
蓝框→更新层 1 的权重(W1_DN)
红框→更新层 1 的合成权重(W1_sythn)
带有高斯噪声的反向传播
Back Propagation with Gaussian Noise
对于纯神经网络,高斯噪声下的标准反向传播也没什么特别的。但是对于 DNI,当更新正常权重(红框)和合成权重(蓝框)时,我添加了高斯噪声。
结果
因此,无噪声解耦神经接口的最终成本最小。至少在这个场景中。当我玩 hyper parameters 的时候,我意识到 DNI 对学习速率非常敏感,你自己试试看,如果学习速率太大,我们会有梯度爆炸。
此外,这有点令人困惑,因为我期望看到案例 3 和案例 4 的损失成本最小。不知道为什么会这样…(也许我会在未来的帖子中详细探讨这个想法。)
但是,当直接与基本事实和最终的分类进行比较时,我们可以看到,仅从颜色上看,情况 2 最接近基本事实。除了红色方框区域。
交互代码
更新:我搬到谷歌 Colab 的交互代码!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要访问互动代码,请点击这里。
最后的话
我仍然很困惑为什么结果会是这样,我认为找出为什么会这样是个好主意…
此外,我看到了我在 DNI 上的旧帖子,并意识到这是多么可怕,我将很快重新访问解耦神经接口。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。
同时,在我的推特这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣,我还在简单的 RNN 上做了反向传播。
参考文献
- Seo,J. D. (2017 年 12 月 24 日)。Only Numpy:推导合成梯度中的前馈和反向传播(解耦神经…2018 年 1 月 22 日检索,来自https://medium . com/@ SeoJaeDuk/only-Numpy-derivating-Forward-feed-and-Back-Propagation-in-Synthetic-Gradient-Decoupled-Neural-ca4c 99666 bbf
- Seo,J. D. (2018 年 1 月 18 日)。only Numpy:Implementing " ADDING GRADIENT NOISE IMPROVES-LEARNING FOR-VERY-DEEP-NETWORKS-with-ADF 23067 F9 f1 2018 年 1 月 22 日检索自https://becoming human . ai/only-Numpy-Implementing-ADDING-GRADIENT-NOISE-IMPROVES-LEARNING-FOR-VERY-DEEP-NETWORKS-with-ADF 23067 F9 f1
- 没有反向传播的深度学习。(未注明)。检索于 2018 年 1 月 22 日,来自https://iamtrask.github.io/2017/03/21/synthetic-gradients/
- 贾德伯格,m .,Czarnecki,W. M .,奥辛德罗,s .,维尼亚尔斯,o .,格雷夫斯,a .,& Kavukcuoglu,K. (2016)。使用合成梯度的去耦神经接口。 arXiv 预印本 arXiv:1608.05343 。
- Neelakantan,a .,Vilnis,l .,Le,Q. V .,Sutskever,I .,Kaiser,l .,Kurach,k .,和 Martens,J. (2015 年)。添加梯度噪声改善了对非常深的网络的学习。 arXiv 预印本 arXiv:1511.06807 。
Only Numpy:实现和比较梯度下降优化算法+ Google Brain 的用交互式代码添加梯度噪声
自从我看到 Sebastian Ruder 的梯度下降算法的视图后。我想写这个帖子已经很久了,因为我不仅想实现不同种类的优化算法,还想将它们相互比较。如果只比较“传统”优化会有点无聊,所以我会增加三种,所有优化方法的列表如下所示。
要比较的优化算法列表
随机梯度下降(一线) b .气势 c .内斯特罗夫加速渐变 d .阿达格拉德 e .阿达德尔塔 f.
j. 噪声训练 k .噪声训练 +高斯加性噪声
l .亚当噪声训练
最后三种方法是我到处玩,简单的噪音训练加上 Gumbel 噪音而不是梯度下降。此外,请注意,我不会提供每个优化算法的反向传播过程的屏幕截图(因为有相当多的),而是我会涵盖几个彼此有点不同的。
训练数据/申报超参数
像往常一样,我们将使用 MNIST 数据集来分类图像 0 和 1。另外请注意绿框区域,我们在这里声明每个测试案例的权重,为了公平审判,我们将它们初始化为相同的权重。
网络架构
现在所有的网络共享相同的架构,它们有三层,每层都有激活函数 elu()、tanh()和 log()。这是逻辑 sigmoid 函数。
反向传播——内斯特罗夫加速梯度
内斯特罗夫加速梯度上的反向传播是我见过的最奇怪的反向传播之一。但这个想法非常有意义,让我们更进一步看到未来,并相应地改变方向。
反向传播— RMSProp
RMSProp 是一种非常有趣的优化方法,因为它不是独立于 Adadelta 发布和制作的。感觉就像一个经验法则,当训练神经网络时,学习速率和速度(动量)一样衰减是一个好主意。
反向传播—那达慕
这是我见过的最酷、最复杂的解决方案之一。结合内斯特罗夫加速梯度和亚当的想法很酷。再次表扬蒂莫西·多扎的想法。
反向传播——谷歌大脑的高斯加性噪声
这里,我们有一个非常简单而强大的解决方案,只是添加高斯噪声到梯度。我仍然对这个简单的方法如何提高整体准确性感到惊叹。
反向传播—噪声亚当
建立噪音训练的想法,我结合了衰减先前梯度以及动量的想法。另外,请注意,对于噪声训练方法,我将学习率设置为 0.00001。
训练和结果——谷歌 Colab
**
上面的图片是在 Google Colab(人类最伟大的发明)上运行代码的训练结果。).我最惊讶的是两件事。红星 Adadelta 的成本已经开始变得疯狂,走向了不归路。
布朗星→亚当噪音优化法实际上开始出现收敛的迹象。看到这一切是如何成为可能的,真是令人惊讶。
另外,请注意您看不到噪声训练结果(j)的原因是因为噪声训练和高斯加性噪声几乎具有相同的成本值,因此一个被另一个覆盖。
从上面可以看出,两种优化方法的成本值非常接近。
交互代码
我搬到了谷歌 Colab 寻找交互代码!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要访问的互动代码,请点击这里。
最后的话
我想发这个帖子已经很久了,终于停止拖延的感觉真好。亚当和噪声亚当优化方法也值得称赞。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。
同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考文献
- 萨顿,R. S. (1986)。网络的反向传播和其他最速下降学习程序的两个问题。在 1986 年认知科学学会第八届年会的会议记录中。
- 钱嫩(1999)。梯度下降学习算法中的动量项。神经网络, 12 (1),145–151。
- Attouch 和 j . Peypouquet(2016 年)。内斯特罗夫加速向前向后法的收敛速度其实比 1/k 还要快暹罗最优化杂志*, 26 (3),1824–1834。*
- j .杜奇、e .哈赞和 y .辛格(2011 年)。在线学习和随机优化的自适应次梯度方法。机器学习研究杂志,12(7 月),2121–2159。
- 医学博士泽勒(2012 年)。ADADELTA:一种自适应学习速率方法。 arXiv 预印本 arXiv:1212.5701 。
- Ruder,S. (2018 年 1 月 19 日)。梯度下降优化算法综述。检索 2018 . 02 . 04,来自http://ruder . io/optimizing-gradient-descent/index . html # fn:24
- http://www . cs . Toronto . edu/~ tij men/CSC 321/slides/lecture _ slides _ le C6 . pdf
- Neelakantan,a .,Vilnis,l .,Le,Q. V .,Sutskever,I .,Kaiser,l .,Kurach,k .,和 Martens,J. (2015 年)。添加梯度噪声改善了对非常深的网络的学习。 arXiv 预印本 arXiv:1511.06807 。
- Seo,J. D. (2018 年 02 月 01 日)。only Numpy:Noise Training—Training a Neural-Network-with Back Propagation with Interactive…2018 年 2 月 04 日检索自https://medium . com/@ SeoJaeDuk/only-Numpy-Noise-Training-Training-a-Neural-Network-with-Interactive-ad 775 f 04 cad6
- t .多扎特(2016 年)。将内斯特洛夫动量引入亚当。
- 金马博士和巴律师(2014 年)。亚当:一种随机优化方法。 arXiv 预印本 arXiv:1412.6980 。
Only Numpy:使用交互式代码对深度神经网络(回归)实施 L1 /L2 范数/正则化的不同组合
Gif from here
我一直对不同类型的成本函数和正则化技术感兴趣,所以今天,我将实现损失函数和正则化的不同组合,以查看哪种性能最好。我们还将看看每个模型的重量的绝对总和,看看重量变得有多小。
Ignore the 7 case — we are going to compare 6 cases
L1-范数损失函数和 L2-范数损失函数
Image from Chioka’s blog
我认为上述解释是对两种成本函数最简单而有效的解释。所以我就不多说了,让我们看看规则。
热门人工智能文章:
L1 正则化和 L2 正则化
Image from Chioka’s blog
同样,从上到下的红框代表 L1 正则化和 L2 正则化。我没有什么要补充的了。然而,由于我必须驱动导数(反向传播),我将触及一些东西。
绝对函数的导数
Image from stack overflow here
如上所述,绝对函数的导数有三种不同的情况,当 X > 1 时,X < 1 and X = 0.
Option 1 → When X > 1,导数= 1
选项 2 →当 X = 0 时,导数=未定义
选项 3 →当 X < 1 时,导数= -1
因为我们不能让梯度“不确定”,所以我打破了这个规则。
My broken rule of derivative
上面的,是我将用来计算 x 值的导数的函数,如上所述,我没有第二个选项,我们把它合并到第一个选项中。
初始化超参数和权重
上面是创建训练数据和声明一些噪声以及学习率和阿尔法值(这些是正则化)。
初始化权重并将其复制到每个案例中。
网络架构+前馈
网拱没什么特别的,简单来说。
由每层下面的红色标记表示。
第 1 层→ 100 个神经元
第 2 层→ 104 个神经元
第 3 层→ 200 个神经元
第 4 层→ 1 个神经元
并且权重具有适当的维度来执行层之间的变换。然而,有两个盒子我想谈一下。
红框→身份激活功能
def IDEN(x):
return x
def d_IDEN(x):
return 1
如果用 python 实现,它看起来会像上面一样,非常简单的线性函数。我们需要这个,因为我们要对连续值进行回归。如果你想知道为什么我们需要激活函数,请阅读我的另一篇博文“ Only Numpy:为什么我们需要激活函数(非线性),在深度神经网络中——带有交互代码”
蓝盒子→反正切 Sigmoid 函数
Image from wiki
可以把这个函数想象成 tanh()函数,但是范围更广。我个人认为,我们不必拘泥于逻辑的乙状结肠或 tanh。 我认为我们需要探索的激活功能种类繁多 。无论如何,如果你想要可视化的 archtan(),请看下图。
Image from wolfam Alpha
成本函数和正则化案例
如上所示,我们总共可以处理 6 个(忽略 7 个)案例。
情况 1 → L1 范数损失
情况 2 → L2 范数损失
情况 3 → L1 范数损失+ L1 正则化
情况 4 → L2 范数损失+ L2 正则化
情况 5 → L1 范数损失+ L2 正则化
情况 6 → L2 范数损失+ L1 正则化
我们将看到每个 case 函数是如何相互区别的!
反向传播(在情况 1、3 和 4 下)
由于每隔一个案例都可以从这三个案例中派生出来,所以我不会做每一个反向传播过程。不过,有一件事我想让你知道。用红色马克笔写的部分是我们违反对绝对函数求导规则的地方!(注意这个!!)
常规结果
正如预期的那样,正则化的网络对噪声最鲁棒。然而具有纯 L1 范数函数的模型变化最小,但是有一个问题!如果你看到绿色星星的位置,我们可以看到红色回归线的精确度急剧下降。
还有,需要注意的一点是蓝星的位置,大多数模型都无法预测 X 开始时 Y 的正确值,这让我很感兴趣。我们来看看权重的绝对和。
总的来说,非常清楚的是,具有正则化的模型具有小得多的权重。其中 L2 正则化的 L1 代价函数具有最小的权值。
常规之外的思考:结果
我是从哪里以及如何得到上述结果的?很简单,我没有遵循绝对函数的严格导数,而是稍微放宽了导数。具体区别见下文。
Regular Back Propagation on Case 5
Special case for loosening up the derivative on Case 5
如上所示,我没有遵循严格的推导规则,而是将成本函数调整为(Layer_4_act — Y)/m。
我认为当谈到深度学习时,有时创造力会产生更好的结果,我不确定,但辛顿博士在反向传播中随机降低权重,仍然取得了良好的结果。无论如何,让我们来看看权重的绝对值总和。
互动代码—常规结果
请点击这个链接查看结果和代码。
互动代码——公约之外的思考:结果
请点击此链接查看结果和代码。
最后的话
我从另一篇文章中看到总共有 7 种正则化技术,所以我只是触及了表面。迫不及待想知道更多。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。
同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还在简单的 RNN 上做了反向传播。
参考文献
- Seo,J. D. (2018 年 1 月 16 日)。Only Numpy:为什么我们需要激活函数(非线性),在深度神经网络中—用…2018 年 1 月 20 日检索自https://medium . com/@ SeoJaeDuk/only-Numpy-Why-we-needle-Activation-Function-Non-Linearity-in-Deep-Neural-Network-With-529 e 928820 BC
- 反正切。(未注明)。检索于 2018 年 1 月 20 日,来自http://mathworld.wolfram.com/InverseTangent.html
- 乙状结肠函数。(2018 年 1 月 18 日)。检索于 2018 年 1 月 20 日,来自https://en.wikipedia.org/wiki/Sigmoid_function
- (未注明)。检索于 2018 年 1 月 20 日,来自http://www . chioka . in/differences-between-L1-and-L2-as-loss-function-and-regulation/
- 用极限定义求|x|的导数。(未注明)。检索于 2018 年 1 月 20 日,来自https://math . stack exchange . com/questions/83861/finding-the-derivative-of-x-using-the-limit-definition
- 基于 RANSAC 的稳健线性模型估计。(未注明)。2018 年 1 月 20 日检索,来自http://sci kit-learn . org/stable/auto _ examples/linear _ model/plot _ ran sac . html # sphx-glr-auto-examples-linear-model-plot-ran sac-py
- Jain,a .,Shaikh,f .,Choudhary,a .,Singh,g .,& Kaur,P. (2016 年 2 月 07 日)。Python 中脊和套索回归的完整教程。检索于 2018 年 1 月 20 日,来自https://www . analyticsvidhya . com/blog/2016/01/complete-tutorial-ridge-lasso-regression-python/
- 杰基奇,M. (2017 年 10 月 30 日)。建立一个多层神经网络与 L2 正则化使用张量流。检索于 2018 年 1 月 20 日,来自https://markojerkic . com/build-a-multi-layer-neural-network-with-L2-regulation-with-tensor flow/
仅 Numpy:使用带有交互代码的 Numpy 实现 GAN(通用对抗网络)和 Adam 优化器。(跑甘在线)
所以今天我受到了这篇博文的启发,“TensorFlow 中的生成对抗网络”,我想用 Numpy 自己实现 GAN。下面是原创甘论文作者 @ goodfellow_ian 。下面是从简单的 GAN 生成的所有图像的 gif。
在阅读之前,请注意我不会涉及太多的数学知识。更确切地说,是代码的实现和结果,我将在以后讨论数学。我正在使用 Adam Optimizer,但是,我不会在这篇文章中解释 Adam 的实现。
GAN 中鉴频器的前馈/部分反向传播
同样,我不会说太多的细节,但请注意红色方框区域称为数据。对于 GAN 中的鉴别器网络,该数据可以是由发生器网络产生的真实图像或虚假图像。我们的图像是 MNIST 数据集的(1,784)矢量。
还有一点要注意的是红色(L2A)和蓝色(L2A) 。红色(L2A)是以真实图像作为输入的我们的鉴别器网络的最终输出。蓝色(L2A)是我们的鉴别器网络的最终输出,以假图像作为输入。
我们实现这一点的方法是在将真实图像和虚假数据放入网络之前获取它们。
第 128 行—获取真实图像数据
第 147 行—获取虚假图像数据(由发生器网络生成)
第 162 行—我们的鉴频器网络的成本函数。
另外,请注意蓝框区域,这是我们的成本函数。让我们比较原始论文中的成本函数,如下所示。
Image from original Paper
不同之处在于,我们在第一个学期日志(L2A)前面放了一个(-)负号。
Image from Agustinus Kristiadi
如上所述,在 TensorFlow 实现中,如果我们想要最大化某个值,我们翻转符号,因为 TF 自动微分只能最小化。
我思考过这个问题,并决定以类似的方式实现。因为我想最大化我们的鉴别者对真实图像猜测正确的机会,同时最小化我们的鉴别者对虚假图像猜测错误的机会,我希望这些值的总和达到平衡。然而,我还不能 100 %确定这一部分,我会很快重新考虑这件事。
GAN 中发电机的前馈/部分反向传播
GAN 中发生器网络的反向传播过程有点复杂。
蓝框—从发电机网络产生的假数据
绿框(左角)—鉴别器接受产生的(蓝框)输入并执行前馈过程
橙色框—发电机网络的成本函数(同样,我们希望最大化产生真实数据的机会)
绿框(右角)—发生器网络的反向传播过程,但我们必须通过一路梯度鉴别器网络。
下面是实现代码的屏幕截图。
标准的反向传播,没什么特别的。
训练结果:失败的尝试
我很快意识到训练 GAN 是极其困难的,即使有 Adam Optimizer,网络似乎也没有很好地收敛。因此,我将首先向您展示所有失败的尝试及其网络架构。
- 生成器,2 层:200,560 个隐藏神经元,输入向量大小 100
2。发生器,tanh()激活,2 层:245,960 个隐藏神经元,IVS 100
3。生成器,3 层:326,356,412 个隐藏神经元,输入向量大小 326
4。生成器,2 层:420,640 个隐藏神经元,输入向量大小 350
5。生成器,2 层:660,780 个隐藏神经元,输入向量大小 600
6。生成器,2 层:320,480 个隐藏神经元,输入向量大小 200
所以如上所见,他们似乎都学到了一些东西,但不是真正的 LOL。然而,我能够使用一个巧妙的技巧来生成一个看起来有点像数字的图像。
极端阶梯式梯度衰减
以上是一张 gif,我知道差别很小,但是相信我,我不是在耍你。这个技巧非常简单,也很容易实现。我们首先为第一次训练设置学习率高速率,并且在第一次训练之后,我们通过因子 0.01 设置学习率的衰减。由于未知的原因(我想对此进行更深入的研究),这似乎是可行的。)
但由于巨大的成本,我认为我们正在向一个网络只能产生特定类型数据的“地方”靠拢。意思是,从-1 和 1 之间的数的均匀分布。生成器只会生成看起来像 3 或 2 等的图像。但这里的关键点是,网络不能生成不同的一组数字。事实证明,图像中所有的数字看起来都像 3。
然而,看起来像一个数字是一些什么合理的形象。让我们看看更多的结果。
如上所述,随着时间的推移,数字变得更加尖锐。一个很好的例子是生成的图像 3 或 9。
交互代码
更新:我搬到谷歌 Colab 的交互代码!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
请点击在线访问互动代码。
当运行代码时,确保你是在’ main.py’ tap 上,如上面绿色框中所示。这个程序会问你一个随机的播种数,如蓝框所示。生成一幅图像后,要查看该图像,请单击上面的“单击我”选项卡,红色框。
最后的话
把甘训练到半身不遂是一项很大的工作,我想研究更有效的训练甘的方法。最后一件事,喊出 @ replit ,这些家伙太厉害了!
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。
同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考文献
- Goodfellow,I .、Pouget-Abadie,j .、Mirza,m .、Xu,b .、Warde-Farley,d .、Ozair,s .、… & Bengio,Y. (2014 年)。生成对抗网络。在神经信息处理系统的进展(第 2672-2680 页)。
- 免费的在线动画 GIF 制作工具——轻松制作 GIF 图像。(未注明)。检索于 2018 年 1 月 31 日,来自http://gifmaker.me/
- 张量流中的生成对抗网。(未注明)。检索于 2018 年 1 月 31 日,来自https://wise odd . github . io/tech blog/2016/09/17/gan-tensor flow/
- J.(未注明)。jrios 6/亚当-vs-SGD-Numpy。检索于 2018 年 1 月 31 日,来自https://github . com/jrios 6/Adam-vs-SGD-Numpy/blob/master/Adam % 20vs % 20 SGD % 20-% 20 on % 20 kaggles % 20 titanic % 20 dataset . ipynb
- Ruder,S. (2018 年 1 月 19 日)。梯度下降优化算法综述。检索于 2018 年 1 月 31 日,来自 http://ruder.io/optimizing-gradient-descent/index.html#adam
- E.(1970 年 01 月 01 日)。埃里克·张。2018 年 1 月 31 日检索,来自https://blog . ev jang . com/2016/06/generative-adversarial-nets-in . html
Only Numpy:用交互式代码实现谷歌大脑的+RNN-交集 RNN(递归神经网络中的容量和可训练性)。
image from pixel bay
所以今天,让我们从这篇论文“ 递归神经网络 中的容量和可训练性”来完成实现新颖的 RNN 架构。因为我们已经在我的上一篇博文中实现了更新门 RNN。
Only Numpy:实现和比较 Google Brain 的 Update Gate(递归神经网络中的容量和可训练性)RNN,Hinton 博士的 Initialize RNN,以及带有交互代码的 Vanilla RNN。 ”
让我们完成这项工作。
网络架构:数学形式
这个网络非常不同,不仅有循环部分,还有深度输出(记为 Y 线 19)。现在让我们来看看网络的图形表示。
网络架构
蓝框→递归隐藏状态
红框→新深度输出
绿框→每个时间戳输入
同样,非常直接,只是为了增加一些注释。
σ() → Logistic Sigmoid 激活函数
S1() → ReLU()激活函数
S2() → tanh()激活函数
正向进给操作(针对每个时间戳)
绿色方框→时间戳 1 的输出成本
粉色方框→时间戳 2 的输出成本
紫色方框→时间戳 3 的输出成本
同样,没有什么特别的只是标准的 RNN 前馈。
关于 YY3、HH3、GY3、GH3 的反向传播(时间戳= 3)
这里要注意一点,我不会对重量求导,而是对 YY,HH,GY 和 GH 求导。
为什么?请看看黑盒,我们正在对激活函数的输入进行反向传播。之后我们可以
乘以 h2,如果我们要对 Wrecyy、Wrechh、Wrecgy 或 Wrecgh 执行反向传播,或者
如果我们要对 Wxyy、Wxhh、Wxgy 或 Wxgh 执行反向传播,请乘以 x3。
下面是为时间戳 3 实现的反向传播代码。
关于 YY2、HH2(时间戳= 2)的反向传播
再次,对 YY2 求导,而不是对 Wrecyy 或 Wxyy 求导。另外,请注意红线下的项,该项为零,因为没有变量将 YY2 与时间戳 3 的成本联系起来。(这让我们的生活变得轻松了一些。)
下面是为时间戳 2 实现的反向传播的代码。
关于 YY1 的反向传播,HH1(时间戳= 1)
请注意我把紫色星星放在哪里了,我忘记了那里的一些术语,它应该是(h2 — hh3) * (d_σ()) * (Wrecgh)而不仅仅是(h2 — hh3)。
同样,对于红色下划线的变量是零,因为没有可以执行链式法则的变量。和前面的实现一样,我们对 YY1 和 HH1 求导。
下面是为时间戳 1 实现的反向传播代码。
训练及结果
假的训练数据,左边看到的只是把每个时间戳中的数字相加。所以在 x 的第一行,我们可以看到它从 0,0.5,0。所以尊重的基础真值是 0,0.5 和 0.5。(y 的第一行。)
如右图所示,训练后,我们可以观察到输出值非常接近地面真实值。
互动码
我转到 Google Colab 获取交互代码!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
请点击此处访问互动代码。(谷歌 Colab 版)
请点击此处访问交互代码(复制版本)
最后的话
谷歌大脑,总是有最有趣的网络架构选择。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站。
与此同时,请在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣,我也在这里做了解耦神经网络的比较。
参考
- Collins,j .,Sohl-Dickstein,j .,和 Sussillo,D. (2016 年)。递归神经网络的容量和可训练性。 arXiv 预印本 arXiv:1611.09913 。
- Seo,J. D. (2018 年 1 月 24 日)。Only Numpy:实现和比较 Google Brain 的更新门(容量和可训练性 in…检索于 2018 年 1 月 29 日,来自https://becoming human . ai/only-Numpy-Implementing-and-comparison-Google-brains-Update-Gate-Capacity-and-training ability-in-940 f0ad 80649
Only Numpy:实现高速公路网络,使用带有交互代码的小批量 OOP 方法
Photo of Han River in Seoul, from Pixel Bay
我今天感觉有点懒,但是我仍然想练习我的反向传播技能以及实现神经网络的 OOP 方法。因此,实施网络的明显选择是高速公路网。(我想实现这个网络已经有一段时间了。)
网络架构(数学形式)/修改
Screen Shot from Original Paper
红框→ 仿射变换+非线性激活,我们可以认为这是标准全连接网络中的“正常”层
蓝框 →变换门,我们也可以认为是仿射变换+非线性激活(但激活函数不同)
绿框 →我们将在原始文件的基础上增加我们的修改。在论文中,我们应该直接传递输入,然而为了匹配维度,我将在这里添加仿射变换以及非线性激活函数。(另外,请注意,我将把它们称为“A ”,作为“Added”的缩写形式。)
以防万一,如果有人想知道,原始论文的作者实际上说,如果需要改变维度。然而,为了尽可能保持输入“不变”,我将为添加的部分初始化权重,如下所示。
当公路图层对象初始化时,添加部分的权重都被初始化为 1,而不是高斯分布。
网络架构(面向对象形式)
红框 →每层进给部分
蓝框 →每层反向传播
绿色下划线 →来自下一层的梯度,需要计算当前层的梯度
黄框 →在更新权重之前,计算传递到前一层的梯度(为了保持链式法则。)
粉色下划线 →将渐变传递给上一层,计算其渐变。
我真的很喜欢这种面向对象的方法,我想我会以这种方式实现我的大部分神经网络。
前馈/反向传播
红框 →用合适的维度初始化各层
黄框 →前馈操作以及重量更新的反向传播。最小批量为 3。
粉色方框 →每 2 次迭代,看网络做的怎么样。
训练和结果
首先,成本从 3.75 英镑开始,然后下降到 1.9 英镑,所以网络似乎在学习。然而准确性是可笑的 LOL。
四层高速公路网 77%的准确率,我不知道这是好是坏。如果你能提高网络准确度,请分享你的森派诀窍!
交互代码
我搬到了谷歌 Colab 寻找交互代码!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要访问互动 e 代码,请点击此处。
最后的话
我知道我应该努力提高模型的准确性,但今晚我只是觉得很懒,对不起,哈哈。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。
同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考
- Srivastava,R. K .,Greff,k .,& Schmidhuber,J. (2015 年)。高速公路网。 arXiv 预印本 arXiv:1505.00387 。
- Romero,a .,Ballas,n .,Kahou,S. E .,Chassang,a .,Gatta,c .,& Bengio,Y. (2014 年)。Fitnets:薄深网的提示。arXiv 预印本 arXiv:1412.6550 。
仅 Numpy:使用交互式代码实现迷你 VGG (VGG 7)和 SoftMax 层
Picture from Pixel Bay
我想在卷积神经网络上练习我的反向传播技能。现在我想实现我自己的 VGG 网(来自原始论文“用于大规模图像识别的非常深的卷积网络”),所以今天我决定结合这两个需求。
如果你不了解卷积神经网络的反向传播过程,请查看我的卷积神经网络反向传播教程,这里这里或者这里。
Softmax 层及其衍生物
Softmax Function photo from Peter
Derivative of Softmax photo from Peter
现在有很多关于 softmax 函数及其导数的好文章。所以这里就不深入了。不过我这里链接几个[,这里](http://photo from Peter)这里,这里这里,这里这里。
网络架构(示意图)
所以我们只有 7 层,因此名字是 VGG 7,而不是 VGG 16 或 19。原始实现之间也有两个主要区别。
1.我们将使用平均池而不是最大池。如果你想知道为什么,请查看此链接。
2。我们网络中的信道数量将比原来的网络少得多。为了便于比较,请参见下面的原始网络架构或这里的。
数据准备和超参数声明
如上所述,我们现在不必过滤掉只包含 0 或 1 的图像。由于 SoftMax 图层,我们能够对 0 到 9 的每张图像进行分类。
正向进给操作
这是一个标准的前馈操作,激活函数 ReLU()用于卷积层,tanh()和 arctan()用于完全连接的层。
反向传播
由于我们使用的是平均池而不是最大池,反向传播非常容易和简单。需要注意的一点是,我对卷积层和全连通层设置了不同的学习速率。(绿色方框区域)。
更新:请注意在代码中有一个错别字,我将调用以上反向传播作为断开的反向传播,因为我们正在用 w1 而不是 w2 更新 w2。
训练和结果(正确的反向传播)
简·扎瓦日基指出了我的错别字,所以我修改了它,并重新培训了网络。如右图所示,是一段时间内的成本值。
该网络在测试集图像上也做得更好,准确率为 84%。
训练和结果(反向传播中断)
因此,随着时间的推移,成本也稳定下降,但是该模型在测试集图像上表现不佳。
在 50 个数字中,只能正确分类 39 个,准确率约为 78%。
交互代码
为了交互代码,我搬到了 Google Colab!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要访问交互代码,请点击此链接。
遗言
VGG 网络是实践前馈操作和反向传播的非常好的网络,因为它们都是直接的。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。
同时,在我的推特这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考
- Simonyan 和 a . zisser man(2014 年)。用于大规模图像识别的非常深的卷积网络。 arXiv 预印本 arXiv:1409.1556 。
- 罗兰茨,p .(未注明)。如何实现一个神经网络间奏曲 2?检索 2018 . 02 . 07,来自http://peterroelants . github . io/posts/neural _ network _ implementation _ intermezzo 02/
- R.(未注明)。rasbt/python-机器学习-图书。2018 . 02 . 07 检索,来自https://github . com/rasbt/python-machine-learning-book/blob/master/FAQ/soft max _ regression . MD
- 交叉熵损失函数简介。(2018 年 01 月 07 日)。检索 2018 . 02 . 07,来自https://sefiks . com/2017/12/17/a-gentle-introduction-to-cross-entropy-loss-function/comment-page-1/# comment-600
- Vgg16。(2016 年 2 月 26 日)。检索于 2018 年 2 月 7 日,来自https://blog . heuritech . com/2016/02/29/a-brief-report-of-the-heuritech-deep-learning-meetup-5/vgg 16/
- 2018.【在线】。可用:https://www . quora . com/What-the-benefit-of-use-average-pooling-than-max-pooling【访问时间:2018 年 2 月 7 日】。
Only Numpy:使用交互式代码为 MNIST 分类实现简单的 ResNet(具有随机深度的深度网络)
Image from Pixel Bay
所以我在读这篇文章“随机深度网络将成为新的范式 l”,在那里我看到了论文“具有随机深度的深度网络”。在阅读这篇论文时,我看到了下面的图表。
ResNet Image from Original Paper
我立刻受到启发,建立了自己的 Res Net。然而,由于批处理规范化对于反向传播来说实现起来有点复杂,所以在今天的实现中我就不把它们算进去了。但是我保证,我会很快实施的!
网络架构(数学形式)
如上所述,网络架构非常容易理解,我们有某种函数 f()来转换输入数据。我们还有一个额外的函数 id(),即 Identity 函数,它允许从上一层直接连接到当前层。
前馈操作/部分反向传播
(数学方程)
绿框→3 个剩余块的前馈操作
红框→隐藏权重的部分反向传播。
蓝色下划线→相对于 W3H 的反向传播
粉色下划线→相对于 W2H 的反向传播
紫色下划线→相对于 W1H 的反向传播
现在,我不会对每个权重执行反向传播,但是对 W3b、W3a、W2b、W2a、W1b 和 W1a 的反向传播也很容易。
前馈操作(代码)
红色方框→ Res 模块 1
绿色方框→ Res 模块 2
蓝色方框→ Res 模块 3
对静止块前馈操作非常简单而有效。然而反向传播过程有点复杂。
反向传播(代码)
Res Net 中反向传播有点复杂的主要原因是因为在残差块的末尾发生了加法。在执行反向传播时,我们需要确保我们将所有梯度相对于该权重相加。代码中带红色下划线的部分执行加法。
培训和结果(相同的学习率)
现在,首先我为隐藏权重和其他权重设置了完全相同的学习速率。无论我如何努力,我都无法在这种环境下得到好的结果。所以我决定简单地为不同“类型”的重量设定不同的学习率。
培训和结果(不同的学习率)
对于一个 10 类图像的简单分类任务来说,72 %的准确率并不令人印象深刻。我会回来,希望增加这个模型的准确性。但是看起来,为不同“类型”的权重设置不同的学习率会有更好的结果。
交互代码
我搬到了谷歌 Colab 寻找交互代码!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
最后的话
在论文“具有随机深度的深度网络”中提出的主要网络不是简单的 Res 网,而是它们引入了具有随机深度的网络。我将很快尝试实现批量标准化网络。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。
同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考
- 黄,孙,杨,刘,陈,丁,温伯格(2016 年 10 月)。具有随机深度的深度网络。在欧洲计算机视觉会议(第 646–661 页)。斯普林格,查姆。
- D.(2016 年 06 月 05 日)。随机深度网络将成为新常态。检索于 2018 年 2 月 8 日,来自http://deliprao.com/archives/134
Only Numpy Medical:使用交互式代码的神经网络对肺部 CT 扫描去噪—第 1 部分,普通自动编码器模型
Image from Pixel Bay
我的激情在于人工智能,我希望我的遗产是在医疗保健领域,使用人工智能。因此,为了实现我的梦想,也为了实践实现神经网络的 OOP 方法,我将开始一系列肺部 CT 扫描的第一部分。我将用 Adam Optimizer 实现普通的自动编码器来开始这个系列。
注:所有的 DICOM 图像均来自 癌症影像存档网 ,如果您打算使用这些数据,请查阅他们的数据使用年龄政策。具体来说,我将使用来自 仿真模型 FDA 数据集的 DICOM 图像。
训练数据和生成的噪声数据
这个想法很简单,我们有原始的 DICOM 图像,如左图所示,我们将添加一些随机噪声,使图像看起来像右图。
我们可以通过添加随机高斯分布噪声并乘以某个常数值来实现这一点。
网络架构(图形形式)
黑盒 →输入 512*512 尺寸的 DICOM 图像
蓝/绿方块 →编码器部分,3 卷积运算,在最后一层我们对图像进行矢量化(展平)
红/黄色方块 →解码器部分,输入编码矢量,并对其进行整形,以执行 3 层卷积运算。
如上所述,组成自动编码器的组件非常简单明了。
网络架构(面向对象形式)
如上所述,每个模型都有三种不同的功能。
a .初始化 →初始化模型中的所有权重
b .前馈 →根据型号是编码器还是解码器,要么以图像为输入,要么以编码矢量为输入,执行标准前馈操作。
c .反向传播 →这是模型的关键功能,我们在这里计算每一层的错误率,并调整模型的权重,以学习最佳权重。
前馈操作(编码器/解码器)
红框 →编码器卷积运算部分
蓝框 →编码器全连接层运算部分
蓝框 →解码器全连接层运算
红框 →解码器卷积运算
我想指出两件事。
1。从编码器到解码器的操作顺序是相反的。(或者换句话说,镜像。)
2。为了执行降维,我们将在编码器中使用均值池。为了对图像进行上采样,我们只需在解码器中重复矩阵中的每个元素。
反向传播(编码器/解码器)
红框→ 编码器的 Adam 优化器更新
蓝框 →执行编码器的反向传播
蓝框 →为解码器执行反向传播
紫框 →将梯度传递给编码器,在更新权重
红框 → Adam 优化器为解码器更新之前计算梯度。
朴素成本函数
对于这个普通的自动编码器,我将使用简单的成本函数,这是 L2 平方成本函数,但分母是 1/4,而不是 1/2。我意识到,我们可以在这里使用许多其他成本函数,例如 SSIM,或者我们甚至可以使用 VGG 16 作为成本函数,如论文“深度特征作为感知度量的不合理有效性”中所示。但是现在让我们继续关注 L2。
训练和结果——普通随机梯度下降
实际上,我对结果感到惊讶。我原以为解码后的图像会是一片漆黑或者全是灰度图像,然而令我惊讶的是,在解码后的图像中间几乎看不到黑点。
培训和结果— Adam Optimizer(高学习率)
编码器的学习率→ 0.0005
解码器的学习率→ 0.001
如上所述,当学习率被设置为高值时,解码图像看起来就像一个带有黑色随机噪声的白色圆圈。
训练和结果— ReLU 激活功能(高学习率)
编码器学习率→ 0.000006
解码器学习率→ 0.0000006
左边的 GIF 是第一个 50 纪元,右边的 GIF 是最后的 50 纪元,所以总共 100 纪元。我们可以再次看到在解码图像的中心形成“白圈”的相同趋势。
训练和结果— ReLu 激活功能(低学习率)
编码器的学习率→ 0.0000001
解码器的学习率→ 0.0000001
左边的 GIF 是第一个 50 纪元,右边的 GIF 是最后的 50 纪元,所以总共 100 纪元。在低学习率下,我们可以看到图像的肺部部分(左图),但是随着学习的进行,白色圆圈再次出现。
训练和结果——双曲正切/反正切激活函数(高 LR)
编码器的学习率→ 0.000006
解码器的学习率→ 0.0000006
左边的 GIF 是第一个 50 纪元,右边的 GIF 是最后的 50 纪元,所以总共 100 纪元。与具有高学习率的 ReLU 激活模型非常相似,但同样以白色圆圈结束。
训练和结果——双曲正切/反正切激活功能(低 LR)
编码器学习率→ 0.0000007
解码器学习率→ 0.0000001
左边的 GIF 是第一个 50 纪元,右边的 GIF 是最后的 50 纪元,所以总共 100 纪元。因此,将学习率调整到较低是一个简单的解决方案,但是我们还不能说图像已经被成功去噪。
一段时间内的成本
无论我选择使用 ReLU、Tanh 还是 Arctan 激活函数,成本似乎都随着时间的推移而降低,但是如果你看一下 Y 轴,它不在 0 附近,也不在产生可接受的去噪图像的范围内。
交互代码
为了交互代码,我搬到了 Google Colab!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
现在运行这段代码有点复杂,因为我使用了自己的数据集。不过,不要担心,我已经将我使用的所有 DICOMs 上传到我的公共 Gitlab,要访问它请点击此链接。要访问存储库的主页,请点击此处。现在请按照一步一步的教程。
- 从上面的链接下载“lung_data_small.zip”文件。
2.将 Google Colab 中的代码复制到您自己的游戏中。运行代码时,会弹出一个小按钮,如上所示。(绿色方框)。单击选择文件并选择最近下载的“lung_data_small.zip”文件。
3.该计划将完成上传数据到谷歌 Colab,它将继续运行。
所以记住上面的简短教程,请点击这里访问交互代码。
遗言
我很抱歉对我自己的模特这么说。但我对这款香草款没抱太大期望。然而,我相信自动编码器是迷人的算法,我认为自动编码器有巨大的潜力。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 找我。
同时,在我的 twitter 上关注我这里,访问我的网站,或者我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考
- 越来越多的癌症医学图像档案。(未注明)。检索于 2018 年 2 月 12 日,来自http://www.cancerimagingarchive.net/
- Gavrielides,Marios A,Kinnard,Lisa M,Myers,Kyle J,Peregoy,,Pritchard,William F,曾,荣平,… Petrick,Nicholas。(2015).数据来自 Phantom_FDA。癌症影像档案。http://doi.org/10.7937/K9/TCIA.2015.ORBJKMUX
- 癌症影像档案维基。(未注明)。检索于 2018 年 2 月 12 日,来自https://wiki . cancerimagingarchive . net/display/Public/PhantomFDA # 9d 6953 e 17646457293 a 77021 aa4 CDB 37
- Python 中的 DICOM:用 PyDICOM 和 VTK 将医学图像数据导入 NumPy。(2014 年 10 月 25 日)。检索于 2018 年 2 月 12 日,来自https://py science . WordPress . com/2014/09/08/DICOM-in-python-importing-medical-image-data-into-numpy-with-pydicom-and-VTK/
- 1.(2017 年 08 月 04 日)。自动编码器——比特和字节的深度学习——走向数据科学。检索于 2018 年 2 月 12 日,来自https://towardsdatascience . com/auto encoders-bits-and-bytes-of-deep-learning-eaba 376 f 23 ad
- 如何使用 Python 并排绘制两个图?(未注明)。检索于 2018 年 2 月 12 日,来自https://stack overflow . com/questions/42818361/how-to-make-two-plots-side-by-side-using-python
- numpy.repeat 的反义词是什么?(未注明)。检索于 2018 年 2 月 12 日,来自https://stack overflow . com/questions/40617710/what-the-opposite-of-numpy-repeat
- J.(2017 年 2 月 27 日)。JaeDukSeo/Python _ Basic _ Image _ Processing。检索于 2018 年 2 月 12 日,发自 https://github.com/JaeDukSeo/Python_Basic_Image_Processing
- Ruder,S. (2018 年 2 月 10 日)。梯度下降优化算法综述。检索于 2018 年 2 月 12 日,发自 http://ruder.io/optimizing-gradient-descent/index.html#adam
- 1.(2017 年 7 月 26 日)。自动编码器在面向数据科学的深度神经网络中至关重要。2018 年 2 月 12 日检索,来自https://towardsdatascience . com/auto encoders-is-essential-in-deep-neural-nets-f 0365 b 2 D1 d 7 c
- 张,r .,伊索拉,p .,埃夫罗斯,A. A .,谢赫曼,e .,,王,O. (2018)。深度特征作为感知度量的不合理有效性。 arXiv 预印本 arXiv:1801.03924 。