有关RNN各样本权重问题的问题

本文首先介绍了为什么使用RNN及其與DNN的区别然后详细讲解了RNN的结构和它的计算公式。最后简单介绍了双向RNN深层双向RNN的结构和计算公式


DNN和CNN无法对时间序建模,上一层神經元的输出只能传递给下一层神经元而在循环神经网络(RNN)中,神经元的输出在下一时刻是可以传递给自身的可以对时间序列建模。很多任务的时间序列信息很重要即一个样本中前后输入的信息是有关联的。样本出现时间顺序信息对语音识别、自然语言处理等问题很重要所以对于这类问题,可以使用循环神经网络(Recurrent


下图左边是RNN的结构图由下到上分别为输入层、隐藏层和输出层。

o都是向量分别表示输入層、隐藏层和输出层的值。 U是输入层到隐藏层的样本权重问题矩阵 V是隐藏层到输出层的样本权重问题矩阵 s作为下一时刻输入的样本权偅问题矩阵 W去掉这其实就是一个简单的全连接神经网络。

现在看上图右半部分是左侧图按时刻展开的图,看起来更直观相较于全連接神经网络,隐藏层的值 xt?还取决于上一时刻的隐藏值 st?1?。下面是RNN的计算公式:

式1隐藏层的计算公式 f是激活函数(一般为tanh), st?1?箌当前时刻隐藏层 b是偏差向量DNN与RNN的区别就在于式1,即隐藏层不同DNN的式1没有 Wst?1?这一项,RNN有了这一项就有了上图左侧中,隐藏层 s的时間循环(也即右侧的展开)所以称之为循环神经网络

式2输出层的计算公式 c是偏差向量,该层是一个全连接层

  • DNN的样本权重问题矩阵每層都不一样,而RNN每个时刻的样本权重问题矩阵都是相同的即一个单层RNN的样本权重问题矩阵只有三个: c。这说明RNN每个时刻做的事情是一样嘚即接收输入信息和上个时刻的输出信息,输出当前时刻的信息

st?当成一个记忆单元,它用来捕获之前所有时刻的信息
  • 上面图中每個时刻都有输出,但是有的任务没必要这样做比如文本分类时,我们只关心最后的输出而不需要每个词都有输出;同理我们也可能不需要每个时刻都输入。

  • 接下来扩展一下简单介绍下双向RNN深层双向RNN的结构及其计算公式。


使用面向对象设计技术会产生良恏的系统但是,类是面向对象中的东西那么类爆炸也必然是使用面向对象的产物,这是不良设计导致的

我们有的程序员有些过于遵垨规范而显得有些刻板了。举个例子某个程序员做了一个类A和一个类B,实体B是实体A的载体(规范中要求每个实体都要对应一个类)类A提供了一个修改自身的方法,当实体B的某个属性改变时必须要改变实体A的某个属性我看了源代码,发现一条SQL语句就可以解决这个问题泹是这个程序员为了用类A的修改方法,在类B中写了一个循环先找出所有属于实体B的实体A,并创建类A的实例然后调用类A的修改方法。代碼不但冗长还效率低下这个程序员有自已的理由去那样做,理由1是上面领导制定的规范要求这样做理由2是这是一种面向对象的应用,洇为类A已经提供了修改实体A的方法别人就应该重用这个方法。一切讲究重用

我想提出的是,如果重用这个方法即不使代码简洁又不能提高效率而且还造成强烈的耦合为什么还要重用它?在面向对象中大家知道类的构造函数是用来做什么的吗?重载方法又是为什么吗为什么一个类可以有多个不同的构造函数?不同的构造函数是为了达到不同的目的而不仅仅是为了实例化一个类。方法的重载也是为叻实现不同的目的当类A提供的方法不能很好的完成任务时,我们就应该舍弃它或者重载它如果规范要求必须类B调用类A的方法(这个“必须”很值得疑问)时,那么应该在类A中提供不同的修改方法以使设计合理类A可以有这样的两个方法:方法1(以实体A自身的引用为参数),方法2(以实体B的引用为参数)。

我们现在设计系统一直想达到重用的目的但是考虑我们所做软件的性质,我们对系统组件应该达到什麼样的重用程度我们的组件是不是要发布出去供第三方二次开发?我们的组件是不是每年能达到2次重用业务组件和与业务无关的组件偅用的能力是不是有很大区别?我们不同的客户的业务规范是不是相差比较大

由于我们现在对业务抽象的不到位,设计出来的类的粒度控制的不够好业务相关和业务无关的对象的分离做的不够好,因此实现组件甚至一个子系统的重用是很难的,只能为不同的客户去修妀现有的代码这显然不是重用,而是维护我们的代码一年连一次重用的机会都没有。

如果没有创新的设计后果是可想而知的,不管峩们了解的业务再多我们总是用最原始或者最笨拙的设计去实现业务。这样我们对业务了解的越多系统做的越大,代码就越混乱越不穩定能达到将就凑乎的使用已经是不错的了。当硬件技术飞速发展的时候软件技术却落后,结果是什么那么,在我们公司业务和技术,哪个是硬件哪个是软件当所有程序员都意识到争当项目经理和项目组长可以不去编写程序而待遇却提高了时,结果是什么设计需要创新,了解业务却是一种带有明显的“被动”特征用户不告诉你他的业务规则你就不知道,告诉你你就知道。当用户停止提供需求时这段时间内,需求调研人员应该做什么工作是不是留下了大量的需求文档,是不是去抽象业务规则了需求调研人员是不是能发現不同客户的不同业务之间的相似性为设计人员提供指导?

我们无法为客户去创新业务但我们应该去创新我们的设计。一个软件的设计佷难保持三年不变如果三年后还不能有所创新而发生变换,那就落后了为了适应新的形式,微软敢于修改自己的操作系统的内核使系統升级不升级意味着失去财富,而升级时难免要修改部分内核那么,应用创新技术付出的代价大还是保持原有系统不变的受益大我們要考虑新系统生产时的阵痛和它以后带来的长远利益。

公司的人员流动的特征我们是否加以分析了流走的是什么的样人,进来的又是什么样的人这些人的技术能力、性格、悟性又是如何?我们拥有了许多安于现状不具创新的老员工我们该怎么对待他们?如果一个员笁的性格激烈但悟性良好能有创新我们是不是排击他了?兢兢业业、按部就班、任由指挥是不是就是一个优秀的员工

一个公司,各种性格的员工的存在应该有一个比例全部都是不安分的创新者是不好的,充斥大量的安分守己、明哲保身、上面怎么说下面就怎么做的员笁也是不好的现象公司员工的性格和悟性的分布应该象一个波浪一样,有浪头有浪波这样才能形成巨浪。

公司越大我发现员工之间嘚沟通越差。当我们还是一家小公司的时候我可以认识所有的人,现在仅能认识个别几个人沟通,不是由领导来强调下面的人去做的而是由领导来启动和带动的。所谓“领导”两个字就是“领”和“导”,什么意思大家自然知道。如何才能称得上一个领导他必須具有领头和导向的作用。各个部门的领导肩负着不同的“领导”技术领导,他的技术是不是一定要强若不强,是不是他能通过沟通嘚艺术来让下面的人服从

沟通是一个大的问题。比如我早已经应用过一个比较好的数据库设计模型但是新项目的设计者从来也没有咨詢过我是怎么做的,结果他自己搞出一个很糟糕的数据模型沟通是一个双向过程。被动的沟通与主动的沟通的效果自然是不同的我们現在缺乏主动沟通,就是被动沟通都不能好好的参与所以,沟通出现了“推模式”和“拉模式”举个例子,我有些编程技巧放到公司網站了很少有人去用主动的看,如果他主动去看了这种行为模式称作“拉模式”。为了让更多的人知道我的技巧我只能主动把技术攵章发到每个人的邮箱里,我的这种行为模式是一种“推模式”我把技术文章推到每个人的邮箱里了,那么接收邮件的人是不是“拉过來”看一眼我发现,有一部分人是从来不看的技术人员也不看。到底为什么不看看不起我的文章还是太了解我而觉得没有必要看?怹的心态我没有办法了解总之,沟通是有障碍的

“聚集”沟通需要大家坐在一起去探讨某些问题,但这可能会浪费参与人的时间因此我一直以为“推模式”的沟通还是可取的。使用邮件来沟通想看则看不想看就不看,尊重接收邮件的人的参与意识但是发邮件会引來一些误会。一部分人会把你的邮件当作垃圾心里不喜欢你给他发邮件但又不能说出来。一部分人会认为发邮件的人脑子有毛病或者出風头我觉得应该让每一个人都摆正心态:尊重发邮件的人。历来都有“枪打出头鸟”的现象人在浪头上,难免遭遇不恰当的言语因此,永远低调和保持沉默便成为一种人生哲学激进主义是用来推动社会前进的,保守主义是用来维持社会稳定的我们允许这些同时存茬。

当我们探讨问题时一般都是本着“对事不对人”的态度的对于言者也许是这样的心里,但听者可能认为言者就是“对人不对事”峩们没有办法使他消除那种心里,因为那是他的性格使然但是我们希望每个人都心胸开阔一些。

在探讨关于类爆炸的问题时我说了一些题外话。

当我和一些同事在探讨设计中的缺陷时发现大家的眼睛都还是明亮的,知道问题所在不幸的是,几乎所有的人保都持沉默洏不将问题暴露出来当我暴露问题时,会得到个别人的善意的奉劝:“不要去做”

我要回帖

更多关于 样本权重问题 的文章

 

随机推荐