本文目录一览:
- 1、如何用梯度下降法求函数y = c+((1-c)/(1+exp(-1.7*a*(x-b))))中的参数a,b,c,已知x和y?
- 2、转行深度学习,如何解决自己在学习中遇到的瓶颈问题?
- 3、怎么用C++编写梯度下降法?
如何用梯度下降法求函数y = c+((1-c)/(1+exp(-1.7*a*(x-b))))中的参数a,b,c,已知x和y?
给的条件有点少,我多点假设。
已知X,Y,我认为是已知给定X输入和对应期望的Y输出。
对于优化目标函数,也就是最后的训练误差函数,视为最简单的实际输出Y'和期望输出Y的均方差。
已知学习率n(可以自行设置)。
假设输出层激活函数为线性。
1.设置初始的a,b,c(任取)
2.计算实际的Y'输出
3.根据期望Y和实际Y',得到对应的均方差J
4.使用误差函数J对a,b,c分别求偏导(链式法则),并代值计算出数字
5.对初始的a,b,c减去(学习率*对应的偏导),得到新的a,b,c
6.重复第二步,迭代一定的轮数或误差小于一个期望值。
7.输出a,b,c.
转行深度学习,如何解决自己在学习中遇到的瓶颈问题?
大数据和高性能的计算能力,让深度学习技术开始超越人类。随着深度学习技术在应用上已经取得的快速发展,有人开始认为,科技既然能够通过互联网,让全世界实现信息共享,那么,随着以深度学习为代表的人工智能技术的发展,有理由相信,未来将会有比人的智力更高的新物种被创造出来。
不过,在众人普遍看好深度学习技术的发展前景时,也有业内专业人士指出,深度技术在发展方面还存在着不少问题。这些问题主要体现在以下几个方面。
(1)理论问题。
深度学习的理论问题主要体现在统计学和计算两个方面。对于任意一个非线性函数,都能找到一个浅层网络和深度网络来表示。深度模型比浅层模型对非线性函数具有更好的表现能力。但深度网络的可表示性并不代表可学习性。要了解深度学习样本的复杂度,要了解需要多少训练样本才能学习到足够好的深度模型,就必须知道,通过训练得到更好的模型需要多少计算资源,理想的计算优化是什么。由于深度模型都是非凸函数,也就让深度学习在这方面的理论研究变得非常困难。
(2)建模问题。
工业界曾经有一种观点:“在大数据条件下,简单的机器学习模型会比复杂模型更有效。”在实际的大数据应用中,很多最简单的模型得到大量使用的情形也在一定程度上印证着这种观点。
但是,随着深度学习的快速发展,人们不得不重新思考这种观点。因为在大数据情形下,往往只有比较复杂或表达能力强的模型,才能充分挖掘海量数据中的信息。随着深度模型变得更强大,从大数据中发掘出的信息往往更有价值。大数据需要深度模型。比如说,语音识别所涉及的是大数据机器学习问题。其声学建模所面临的是高达十亿到千亿级别的样本训练。Google公司在一个语音识别实验中发现,训练后的DNN,训练样本上的预测误差,竟然与测试样本的预测误差基本相当。而在通常模型上,训练样本上的预测误差要明显小于测试样本。这是因为大数据里含有丰富的信息维度,从而让DNN这样高容量的复杂模型处于欠拟合状态。由此也就表明大数据需要深度学习。浅层模型模拟人工经验抽取样本特征,其功能主要是负责分类或预测。在这种情形下,特征的好坏就成为整个系统性能的关键。为此,为了发掘更好的特征,开发人员就得对需要解决的问题有深入的理解。要做到这一点,就需要反复摸索,这在时间上往往要花费数年。这就表明,人工设计样本特征在可扩展性上欠佳。
深度学习的实质是学习更有用的特征,最终提升分类或预测的准确性。其方法是构建深度模型和海量训练数据。可以说,特征学习是目的,深度模型是手段。相对浅层学习来说,深度学习具有多达5层、6层,甚至是10多层的隐层节点,还突出了特征学习的重要性。深度学习通过逐层特征变换,让分类或预测变得更容易。
利用大数据来学习特征,比通过人工规则来构造规则更能刻画数据的内在信息。那么,在推进深度学习的学习理论与计算理论时,能不能提出新的具有强大表示能力的分层模型呢?在具体应用上,又该怎样设计一个用来解决问题的最合适的深度模型呢?还有,是否存在可能建立一个通用的深度模型或者是建模语言呢?这些都是深度学习必须面对的问题。
(3)工程问题。
对于从事深度学习技术研发的人来说,首先要解决的是利用并行计算平台来实现海量数据训练的问题。深度学习需要频繁迭代,传统的大数据平台无法适应这一点。随着互联网服务的深入,海量数据训练的重要性日益凸显。而现有的DNN训练技术通常所采用的随机梯度法,不能在多个计算机之间并行。采用CPU进行传统的DNN模型训练,训练时间非常漫长,一般训练声学模型就需要几个月的时间。这样缓慢的训练速度明显不能满足互联网服务应用的需要。目前,提升模型训练速度,成为许多大公司研发者的主攻方向。比如谷歌公司,搭建起了DistBelief这个深度学习并行计算平台。通过采用异步算法,实现随机梯度下降算法的并行化,从而加快模型训练速度。不过,工程方面尽管取得了一定的进展,但对解决各种服务需求来说,仍然有很长的一段路要走。
深度学习引领着“大数据+深度模型”时代的到来。尤其是在推动人工智能和人机交互方面取得了长足的进步。同时也应该看到,深度学习在理论、建模和工程方面仍面临着一系列的难题。而在具体应用方面,深度学习也面临着一些挑战。
人工智能神经网络建设从最初的设想到成为信息技术中的应用,花了超过50年的时间。在克服传统计算机性能不足方面,神经网络算法较其他算法更具有先进性。在早期的实验中,网络训练方法是:“迭代地调整每个神经元施加到其输入的数据,来尽量减少整个网络的输出与所希望的结果之间的误差。”这样的训练虽然较过去有所改善,但让深度学习在规模上面临着一个挑站。
2006年,多伦多大学开发的训练技术能用于包含多个隐藏层的网络,其中的一种技术叫作“预训练”。这种方法能让上层提取高级特征,但无法解决规模问题。处在较高层的神经元,需要巨大的计算能力。如用于图像处理应用程序的第一层所需要分析的像素就多达一百万个。深度网络的多个层连接的数量非常巨大,每个图像的连接就达几十亿甚至上千亿。训练这样的大型网络,需要数千亿的浮点运算。这样的巨大规模,让神经网络的训练变得非常缓慢
怎么用C++编写梯度下降法?
#includeiostream
#includecmath
#includectime
using namespace std;
double f(double x);
double g(double x);
double gd(double xs,double s)
{
double x=xs;
double y;
for(int i=0;i!=20;++i)
{
double grad= -1*g(x);
x+=grad*s;
y=f(x);
cout "EPOCH "i" grad = " setprecision(15) grad " x = " x " y = " y endl;
if(abs(grad) 1e-6)
break;
}
return x;
}
int main()
{
double xk=-5,ak=0.1;
gd(xk,ak);
}
double f(double x)
{
return x*x-2*x+1;
}
double g(double x)
{
return 2*x-2;
}