区块链100讲:区块链中的随机数

Chainlink生成随机数的方法一 随机数在软件设计中有很广泛的应用场景,尤其是在游戏中、菠菜、彩票等业务。但在区块链产生一个真正随机的数字确不容易,主要原因是区块链的共识机制需要所有节点达成一致,这使得智能合约中不可能存在真正随机的数字,否则各节点无法达成一致。本文主要介绍预言机生成随机数的原理,以及对比Chainlink生成随机数的两种方法。 阅读详情

image

我们生活的环境充满了随机性。一直以来,运气,概率和命运这些概念都与随机性紧紧联系在一起。所有人类无法理解或无法预测的事物往往都被归类为随机事物。从生理上来说,我们也是沉浸在了随机海洋中。从云的运动到粒子和波浪的行为,随机性简直无处不在。

然而,尽管人类接触到了各种各样的随机事物,对随机性很熟悉,但依然难以将它转化为计算机可以使用的东西。当我们谈论计算机系统中的随机性时,我们真正指的是伪随机性,即尽可能模拟出现实世界应有的随机性,使之近乎于“真正的随机性”。以密码学安全伪随机数生成器为例,这是一个非常强大的随机性模拟。

随机数在隐私技术和密码学中发挥着重要作用。令人惊艳的是,通过生成一个随机数来对一条消息进行异或运算(XOR),提供了一种简单但十分强大的加密方案。即使是双方之间最简单的私人通信形式(即双方提前共享密钥的对称加密方案)也要求共享的密钥是随机的。如果此共享密钥不是随机的,则加密就毫无用处,因为任何知道密钥生成算法的人都可以确定密钥然后解密该条消息。

随机数的重要性不仅体现在安全通信渠道的建立上,还体现在确认通信对象上。如果多个人试图通过有限带宽的频道来互相通信,则可以利用随机数来确定频道携带消息的合理顺序。

随机数能够有效帮助团体或计算机达成一致协议或共识。随机共识协议就是这样一个例子。本文将探讨随机数在区块链中的作用。

区块链就是一个多方尝试就全局视角的某种更新达成一致(共识)的成功案例。更新通常在一轮内完成,也就是在一个周期性离散时间间隔内。

在互联网上,特定时间段内发送的消息数量是有上限的(即吞吐量),并且发送消息必将花去一定的时间( 即延迟),这都对共识造成了一定的限制。任何区块链共识协议的目标是在上述限制范围内达成一致协议。在公链上有数千个节点参与了区块链的维护,如果每个节点需要向所有其他节点发送消息并获得其反馈,那么网络的限制会大大增加达成共识的成本。这是因为在一轮时间内通过网络发送的消息数量太大。因此,为了确保共识,则需要通过减少在互联网上发送消息的数量来优化通信方案。

比特币达成此协议(中本聪共识)的方式是通过使用 工作证明(PoW)作为随机数源来确定每一轮中哪一个区块将会被添加到区块链中,从而减少消息传递的费用。因为 PoW 设置的题目在算法上非常难解决,只有最先算出来的人才能将他们的区块添加到分类帐中。由于多个人同时解开难题的概率非常低,因此 PoW 可以作为一种限制网络消息传递数量的机制。

理论上,任何试图取代 PoW 的共识机制都需要找到一种方法来限制网络传递消息的数量。大多数权益证明(PoS)协议用于解决该问题的方法是根据验证者持有的代币数量来选出一组验证者(维护与管理区块链的节点)组成一个小组委员会,然后这组验证者可以在网络限制内相互通信并及时达成一致。

当然,为了公平选举出小组委员会的成员,保证没有人会提前知道成员的身份,算法必须能够融入一些公平、无偏倚的(unbiasable)随机数源。一旦该组验证者在下一个区块上达成了一致,那个区块就会被广播给网络中的每一个人。

在 PoS 协议中用于小组委员会选举的理想随机数源必须是不可支配的(unbiasable),即没有人可以随意改变随机种子(seed)。为了实现不可支配性,随机性协议需要确保以下两点:

  • 随机函数总会生成一些随机数;

  • 随机函数生成的随机数没有被操纵

(注意:我们在之后的博客文章中将会探讨 i)与ii) 之间的权衡,以及这种权衡与网络同步模型的关系)

我们在 Mechanism Labs (一个推特号)上分析过的所有小组委员会选举协议都没有满足上面提到的两点。因此,鉴于上述权衡,区块链共识协议应该使用能不断产生随机数的随机数源,而不是使用仅能一次性产生不可支配的随机数的随机数源。因为区块链协议需要确保区块链保持增长、不能让随机数源成为瓶颈。即使是偏好一致性的协议,随机数源也不应该成为区块链停滞的原因。无论如何,随机数源都应该确保协议能够专注于应付其他攻击,比如对验证者组成的小组委员会实施 DoS 攻击使得区块链停滞等等。

如果区块链由于随机函数输出的随机数出现了偏差而完全停止运行,那么社交层就得付出巨大的协调成本来重新启动区块链。这将要求社区通过外部的社交媒体平台就区块链实际上是什么的问题达成一致,而这会是一个非常耗时的讨论,此成本可与当初解决 DAO 黑客攻击的成本相当。社交层的巨额成本也会动摇社区对区块链协议安全性的信心,但只要偏差非常小并且具备从偏差状态恢复的机制,那么几轮的小偏差对区块链安全性的影响就比较微弱,因为公有区块链协议每一轮给予验证者的所有协议奖励是相对较少的。每一轮或每一个时期(每几轮)进行小组委员会选举时,随机函数中的偏差必须非常显著,验证者才能以欺骗协议来牟利并降低区块链协议的安全性。

而在另一个领域内,那些用到随机数的彩票游戏必须保证随机数源绝对不被操纵,因为即使出现一点偏差也会完全改变中奖结果。由于中奖者能够获得大量的即时奖励,所以篡改彩票结果带来的影响是巨大的。因此,这种彩票游戏偏好于一次性生成不可支配随机数的函数,即使这意味着随机函数的输出有时会停止。

本文将探讨基于区块链协议设计的背景下公正无偏的随机数源的重要性。接下来的文章中,当我们考虑不可篡改的协议时,我们是倾向于不会被中止的协议。

理想的委员会选举方案 应该满足 i)不可被支配,ii)只在新一轮开始时显示随机种子。随机函数必须如前文讨论的定义那样做到不可被偏转。如果随机数被操控(并存在协议内奖励分配机制),就会造成不公平的奖励分配。不恰当的奖励分配意味着一些人将获得更丰厚的奖励。由于只有拥有权益的人才能成为验证者,并且投票权与验证者所拥有的权益成正比,那么不公平的分配将导致区块链最终只掌控在少数验证者手里。因此,协议的不可操纵的程度,决定了是否有人可以长期作为验证者维护部分网络。另一方面,种子在新一轮开始之前提前多久显示,决定了谁可以首先成为网络的一部分。由此可见,上述两个属性将决定区块链的去中心化程度。

由于每一轮(或每一个时期)都会进行小组委员会的选举,因此从公布随机函数输出的随机数到那一轮(或那一个时期)开始所需的时间是至关重要的。在此时间范围内,攻击者可以利用随机函数输出的随机数得知哪些验证者获选。如果此输出被隐藏,则试图攻击区块链协议的攻击者将无法提前得知获选的验证者。此时间范围的长短决定了协议对攻击的承受能力。较强的攻击者,即具有较多计算能力和资源去攻击网络的人,能够在短时间内计算出获选的验证者。如果攻击者有足够的时间,他们会通过运行选举委员会所用的算法以及该轮给定的随机数种子来确定哪些验证者当选,然后对该轮获选的验证者进行拒绝服务(DoS)攻击,导致空白区块的产生,令该轮无任何进展。对区块链来说,即使是停止一轮,后果也是毁灭性的。设想一下,如果几小时内世界上没有人可以进行任何交易,比特币会变成什么样!因此,有能力抗 DoS 攻击的节点才应该首先成为验证者。另外,提前显示种子也意味着共识协议只能应对较弱的攻击者,这弱化了区块链的去中心化性质。

基于我们曾在 替代性共识协议的元分析 中剖析的不同区块链协议的使用案例,下面我们会从技术角度详细介绍各种随机数的生成机制。

Tendermint

Tendermint 是使用一种确定的循环协议方案来选出提议者的;该协议不具备随机性。提议者是根据投票权和验证者被选次数的堆排序算法选出的。攻击者只能通过添加或删除权益来干预协议,但这种干预不能立即生效,因为验证者在系统中移除或者添加权益所需的时间很长。尽管如此,攻击者就可以有更长的时间提前计划好如何操纵提议者的选择。

使用确定性的随机算法意味着随机种子会在远早于每一轮之前公布,提议者也能被提前确定。

Algorand

Algorand 的随机数方案如下:被选为提议者的每一位验证者 v 使用公式 < seedr, π > ← VRFskv (seedr−1||r) 来计算 r 轮的种子,其中 skv 是验证者 v 的密钥,seedr-1 是前一轮的随机种子。

VRF 是用来证明 r-1 轮中接受的区块包含了 π 以及 r 轮的种子。如果给定的 VRF 证明未能验证给定的种子,则每个人计算新一轮的种子 H(seedr−1||r),其中 H 是哈希函数。这意味着必须提前选好每位验证者的密钥,确保他们无法干预随机种子。

当网络不能很好地同步时,攻击者完全控制了消息传递链接(校对注:感觉这里像在说“异步”假设),因此可以删除提议的区块并强制用户支持空白的区块,从而计算出未来用于选举的随机种子。因此,Algorand 要求 弱同步 假设,即在每个时间长度为 u 的周期中,必须存在时间长度为 s(s < u)的强同步来保证协议的不可操纵性。只要 s 值足够大,使得在时间段 b 内至少产生一个诚实的区块,则选择密钥 skv’ 的攻击者 v’ 就不能操控 r 轮的随机种子。

只有当一个区块被提议之后,才会生成一个新的随机数种子,和一个可用来验证的公开 VRF 证明。这确保了提议者和随机种子没有被提前泄露,同时保证 Algorand 能够抵御针对提议者的 DoS 攻击,即使在节点离线甚至瞬间腐化的模式下都能实现自适应安全。

Dfinity

对于大部分协议,攻击者通常会中止协议来调用回退机制,从而操纵随机数。但 Dfinity 使用的门限签名方案(threshold scheme)是不可操纵的,因为选择阈值的原则就是确保攻击者无法通过阻止生成 门限签名 来中止协议(因为随机数种子是从门限签名中推导出来的)。因此阈值 t 必须根据以下公式进行选择:t∈[f + 1,n - f],其中 f 是攻击者控制的签名数,n 是方案中的总签名数,t 是用于生成随机数的签名阈值。选择该阈值是为了确保攻击者既无法预测签名生成的结果,也无法阻止签名的生成。

需要注意的是,在任何 BLS 方案中,只要攻击者拥有 50% 以上 的保证金,他们就能够操控最终的签名与随机数。然而,如果一名攻击者拥有如此大份额的权益,也会出现其它类型的攻击,这种情况就违反了 Dfinity 协议的基本假设。

一旦诚实的验证者进入到第 r 轮,随机种子就会被揭示。虽然从诚实的验证者进入到新一轮正式开始之间的时间差很小,但这个时间差足以让具有大量计算资源的攻击者识别出提议者并对其进行 DoS 攻击。这就是为什么 Dfinity 只能应对温和的攻击者而无法应对瞬时瘫痪的状况。

Thunderella

在哈希函数实例化的随机数预言机方案中,提议者将依据以下公式来确定:H_nonce(pk,q) < Dp,其中 H 是用作随机数预言机的哈希函数,pk 是验证者的公钥, q 是给定的迭代时间,nonce 是哈希函数的熵来源。Nonce 由前一个区块的提议者选择。设置难度参数 D_p 是为了在单个迭代时间内,委员会成员被选为提议者的概率为 w。

如果攻击者提议了一个区块,她可以操控为下一轮哈希函数生成熵的 nonce 值,从而影响下一个区块的提议者的人选。然而,为了降低随机数方案的可篡改性,在哈希函数中相同的 nonce值不仅仅用于选择下一轮的提议者,也会用于选择接下来 r 个轮次的提议者。这使得攻击者在计算上很难通过强制改变 nonce 值来让自己连续成为接下来 r 个轮次的提议者。虽然这种策略仅损失了多项式安全性,但它具有可预测性的弊端(后面也会讨论到)。该方案仅能够应对慢速自适应的攻击者。

在上述算法中,当重复使用相同的 nonce 值给哈希函数喂送种子时,就会导致攻击者能够提前预测到谁是提议者。由于在一时期中相同的 nonce 值被重复用作熵,从而导致随机种子在新一轮开始之前被泄露,使得攻击者可以对提议者进行腐化或者实施 DoS 攻击。

Casper FFG

Casper FFG 计划使用的随机数方案是基于以下算法:

一个时期开始时,每个验证者承诺 H (H (H (…Sv )))),其中 S 是验证者承诺的种子。 R 赋值为 R 与哈希函数内原象的异或运算(R := R⊕ Pre-image of the inner layer of hash)。在一轮中,验证者可以创建或中止一个区块。

如果在回退机制中没有生成随机数,这可能会造成比可预测或可操纵的随机数更大的问题,因为你将不再需要 1/3 的恶意者来中止协议,1个人就足够了。

作为当前提议者的验证者是知道下一轮的随机种子的。

随机数是密码学和区块链的重要部分。不良的随机数方案会通过以下方式破坏区块链的安全性:i)停止区块链协议;ii)导致中心化。 因此,在理解区块链的安全性时,探究随机性在该区块链协议中的角色乃是重中之重!

内容来源:公众号-以太坊爱好者

原文链接:

https://www.tokendaily.co/blog/randomness-in-blockchains

作者: Aparna Krishnan

翻译&校对: 哲妹 & 阿剑

以下是我们的社区介绍,欢迎各种合作、交流、学习:)

image

区块链中的随机数算法 RANDAO RANDAO是一种非常简单的随机性方法,因此非常常用。 一般的想法是,网络的参与者首先都是私下选择一个伪随机数,然后向该私密选择的数字提交承诺,都使用某种共识算法就某些承诺达成一致,然后全部透露其选择的数字,得出一个 对显示的数字达成共识,并对显示的数字进行XOR作为协议的输出。 它是不可预测的,并且与基础共识协议具有相同的活跃性,但存在偏差。 具体来说,一旦其他人开始透露其编号,恶意行为者便可以观察网络,并根据到目前为止所观察到的编号进行异或运算,选择是否透露其编号。 这允许单个恶意行为者对 阅读详情

相关推荐

区块链100讲:区块链的3个阶段和4种分类

在前面几期《区块链100讲》我们介绍了区块链的一些基本概念,也知道区块链至今为止经历了 3个阶段。发展到现在,根据不同的划分标准,可以将区块链分为不同的类别,本期我们将重点介绍区块链的分类。 1 区块链的3个阶段 关于区块链的3个阶段,在《区块链解密:构建基于信用的下一代互联网》这本书中得到了一些概念: 区块链1.0:可编程货币 区块链技术伴随比特币的产生而产生,其最...

HiBlock的博客 7366

区块链中的随机数

我们生活的环境充满了随机性。一直以来,运气,概率和命运这些概念都与随机性紧紧联系在一起。所有人类无法理解或无法预测的事物往往都被归类为随机事物。从生理上来说,我们也是沉浸在了随机海洋中。从云的运动到粒子和波浪的行为,随机性简直无处不在。然而,尽管人类接触到了各种各样的随机事物,对随机性很熟悉,但依然难以将它转化为计算机可以使用的东西。当我们谈论计算机系统中的随机性时,我们真正指的是伪随机性,即尽可...

weixin_33851177的博客 1340

区块链100讲:TOKEN≠数字货币,区块链开发者要如何正确理解TOKEN的价值!

谈区块链就不能不谈Token,虽然技术上来讲Token并不是不可或缺的(比如Fabric中就没有对Token提供直接的支持),但Token的引入会造就一些有趣的应用场景。而且,也有人认为Token是下一代互联网数字经济的关键。 在这样的背景下,本文重点介绍Token。 1 为什么Token值得关注? 不论你身处币圈还是链圈,Token都值得你花时间去看看。个人认为理由有以下几条...

HiBlock的博客 2692

区块链重要基础概念1——随机数的原理以及产生过程

随机数在区块链中作用以及使用过程[3]: 在比特币区块链中,所有参与节点都在遍历寻找一个随机数,节点算力输出越大就越有可能遍历到这个随机数,也就能够抢到这一轮的记账权,这个过程通常被称为“挖矿”。各参与节点在遍历随机数的过程中也在不断地验证其他节点的交易信息,抢到记账权的节点会把所有相关的信息广播出来,全网中所有参与节点在共同验证了广播出来的信息之后就会形成一个区块,紧接在上一个区块的后面,形成一条区块数据链。 遍历寻找随机数通过挖矿获得记账权 现代信息安全体制做到以下几点,使得系统的安全性要求不受

weixin_42295969的博客 2855

区块链中的记账原理讲解

链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 很多人只了解过比特币,不知道区块链,比特币实际是一个运用了区块链技术的应用,只是比特币当时太热,把区块链技术的光辉给掩盖了。区块链才是未来,期望各位开发人员少关怀币价,多关怀技术。 本文将解说区块链1.0技术是怎样实现的。 哈希函数 在讲区块链记账之前,先说明一下哈希函数。 哈希函数:Hash(原始信息) =...

weixin_44172023的博客 5621

探索robotics-toolbox-python:从基础安装到高级机器人运动学应用

本文详细介绍了robotics-toolbox-python工具箱,从基础安装、环境配置到机器人运动学与动力学的核心应用。通过D-H参数、URDF导入和内置模型三种方式快速构建机器人模型,并演示了正逆运动学计算、关节空间与任务空间轨迹规划以及三维可视化仿真。该工具箱极大地简化了机器人算法开发流程,是进行机器人学研究和应用实践的强大工具。

i1j2k的博客 496

区块链之密码学随机数

一、随机数分类 1、真随机数其定义为随机样本不可重现。实际上只要给定边界条件,真随机数实际上并不存在,可是如果产生一个真随机数样本的边界条件十分复杂且难以捕捉,可以认为用这个方法演算出来了真随机数。例如骰子、转轮、噪音等。 2、伪随机数,通过一定算法和种子得出,例如计算机软件中实现的就是伪随机数。 强伪随机数:难以预测的随机数,常用于密...

weixin_33782386的博客 388

Ceres Solver:从入门到使用

Ceres Solver是谷歌开源的C++非线性优化库,能够解决有约束或无约束条件下的非线性最小二乘问题。2010年之后大量的运用在谷歌的产品开发中,尤其在谷歌开源的cartographer中被大量的使用。 ceres可以在Linux,Windows,macOS,Andrioid,IOS系统进行安装使用,详情可查看下方的官网链接。 Ceres Solver 官网:http://ceres-solver.org/

非晚非晚的博客 1万+

区块链随机数-区块链随机数的实现方案

区块链随机数的实现方案 区块链随机数的实现方案 参考URL: https://learnblockchain.cn/2019/08/10/rand-on-chain 传统链上随机数的几种办法 让可信第三方为合约提供随机数 第一种是让可信第三方为合约提供随机数,这种情况通常是中心化的解决方案,通过一个可信的 Oracle 来提供独立的随机数源。智能合约发送请求给独立于区块链系统之外的 Oracle,当 Oracle 监听到链上相关请求后,生成随机数并调用回调函数将结果返回区块链。 这个方案的主要问题式是中

西京刀客 2436

基于OpenSSL的CA建立及证书签发(签发多域名/IP)

自签SSL证书(多域名/IP) 本文基于以下环境: 内核信息:Linux zabbix 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux 系统版本:CentOS Linux release 7.6.1810 (Core) OpenSSL版本:OpenSSL 1.0.2k-fips 26 Jan 2017 【前言】 在基于OpenSSL的CA建立及证书签发一文中(后面统.

hobby云说 4647

NCBI|叶绿体基因组数据上传

叶绿体基因组NCBI上传 小编最近在NCBI上传了好几次数据…想着可以把具体的上传步骤写下来,供大家参考。以下是叶绿体基因组的上传示例,大家可以瞅瞅 图片 准备工作 1.登录NCBI官网:https://www.ncbi.nlm.nih.gov/, 依次点击“sign in to NCBI”——“See more 3rd party sign in options”——搜索“Microsoft live.com”。 ”sign in to NCBI“ ”See more 3rd party sign i

weifanbio的博客 3903

区块链100讲:从村里的账本来看什么是区块链

什么是区块链?这是我见过最易懂的解说。

HiBlock的博客 3368

华为OD机试 - 末世分配资源包 - 二分查找 + 贪心(Python/JS/C/C++ 新系统 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。末世时代,政府为各地方配资源,现有资源分配表 nums[n],要求按如下规则分配给 k 个营地:在最优平均分配情况下,得到最大团队所获得的资源数4,3,6,9,7 216最佳划分之一:[4,3,6] -> 13 [9,7] -> 16最大

学Java,找哪吒 224

区块链100讲:区块链为什么叫“区块”“链”?

区块链第2讲:什么是“区块”,它们是怎么“链”起来的,区块里面记录了什么信息?

HiBlock的博客 1794

【Frida Android】实战篇4:SSL Pinning 证书绑定绕过 Hook 教程(一)

在前两章中,我们学习了中间人抓包与 Hook 抓包的基础方法,这些方法在理想环境下能够有效获取网络请求数据。但在实际的企业级应用中,出于安全防护需求,很多 APP 会启用证书绑定(SSL Pinning)机制。这种机制会让客户端对服务器证书的校验更为严格,导致常规的抓包方法(即使将 BurpSuite/Charles 证书安装到系统信任区)也无法生效。因此,从本章开始,我们将系统学习 SSL Pinning 机制的绕过技术。SSL Pinning(证书绑定)是客户端校验服务器身份的进阶安全机制。

水滴石穿 1612

关于React Native Android找不到node的错误

最近,按照官方文档初始化了一个React Native项目,但是在Android端运行的时候,报了如下的一个错误。 org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:recordFilesBeforeBundleCommandDebug'. Caused by: org.gradle.process.internal.ExecException: A problem occurred starting p

xiangzhihong8的专栏 4247

区块链100讲:详解区块链之P2P网络

1 P2P网络 如果我们简单来看 P2P 技术,它的应用领域已经非常广泛了,从流媒体到点对点通讯、从文件共享到协同处理,多种领域都有它的身影出现。 同样的,P2P 的网络协议也有很多,比较常见的有 BitTorrent、ED2K、Gnutella、Tor 等,也就是我们常说的 BT 工具和电驴。 比特币、以太坊等众多数字货币都实现了属于自己的 P2P 网络协议,但是这种模式并不同于以上讨论的 P...

HiBlock的博客 4403

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

区块链100讲:区块链的TPS性能

最近在做一个区块链系统的底层设计,有一个绕不开的问题是,就是我的系统能提供多少个tps。为此,我收集了一些现有区块链(当然也包括DAG等分布式账本技术)的tps数据。 1 ripple 号称转账神器的ripple,转账快速,并且手续费也很低,所以我本人经常用它来做不同交易所之间的转账。从ripple官网的数据看,大概有1500tps: xrp的tps数据,来自ripple官...

HiBlock的博客 7154

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

区块链100讲:区块链的灵魂——共识算法

在解释拜占庭将军问题的时候提到“共识机制”,本期《区块链100讲》我们来说说被称为区块链灵魂的“共识算法”。 1 共识机制 共识机制,在百度百科上的解释是这样的: 看上去是不是一头雾水?那么我这里就给大家一个比较能通俗易懂的解释:所谓的共识机制,就好比大家在开一次“会议”,最后达成一个一致,但是达成一致的途径有很多种,这也就是后续区块链的主链有各种各样的共识机制。那么这次“...

HiBlock的博客 2459

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

区块链100问

区块链100问01. 从物物交换到比特币02. 什么是比特币03. 比特币白皮书的诞生04. 第一个比特币诞生啦05. 谁是中本聪06. 密码朋克是什么07. 比特币是怎么发行的08. 披萨居然卖到3亿元09. 区块链联盟盘点09. 中本聪的继承者是谁10. 早起比特币还能白送11. 比特币为啥还没挖完12. 比特币如何保持总量恒定13. 比特币和Q币不一样14. 各国和区块链资产15. 比特币怎...

zgf605506394的博客 5269

区块链100讲:Hyperledger Fabric 区块链多机部署

区块链技术可以应用在很多领域,未来最有可能先在这些领域落地。 区块链技术是利用块链式数据结构来验证与存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算方式 。 其应用场景与发展前景,对实体产业与互联网技术的进步,将产生重大的积极意义。 1 银行 本质上来...

HiBlock的博客 2394

区块链安全100问 | 第一篇:区块链安全是什么

零时科技——专注于区块链安全领域 深圳零时科技有限公司(简称:零时科技),公司成立于2018年11月,是一家专注于区块链生态安全的实战创新型网络安全企业,团队扎根区块链安全与应用技术研究,以丰富的安全攻防实战经验结合人工智能数据分析处理,为用户提供区块链安全漏洞风险检测、安全审计、安全防御、资产追溯,以及企业级区块链应用创新解决方案。 零时科技区块链安全100问正式上线,以通俗易懂的语言形式为大家讲解区块链行业知识,以及区块链生态应用存在的安全问题,让更多人了解区块链及区块链安全。 前言 当前区块链技术和应

m0_37598434的博客 3346

区块链100讲:总被提起的拜占庭问题到底是什么鬼?

区块链第3讲:什么是拜占庭将军问题?

HiBlock的博客 2000

一个故事,讲懂什么是区块链

区块链起源 一个故事,讲懂什么是区块链。 我们假设在很多年以前,那时候科技还不那么的发达,没有手机没有电脑,甚至还没有出现一个统一的有效的货币。在一个叫做大河村的村子里住着很多村民,因为没有货币所以他们交易的方式便是通过记账的方式。 就像下面这张图,村民B向村民A买了100元的猪肉,那么相应的A 的账本上便多了100,记为+100。B的账本上便少了100,记为-100。 这就是最原始的交易,村民A和B的账本上都会对这次交易记录一笔。但是如果人数量达到一定程度呢?每产生一笔交易都会实时记录下这一笔,如果当天

Dustmicro的博客 1万+

区块链100讲:Hyperledger Cello简介

Hyperledger Cello是超级账本项目下面的一个子项目,提供按需部署的功能,可以将区块链部署在各种裸机、虚拟机、容器等环境中。该项目最初由IBM发起,目前得到了Soramitsu, 华为,和Intel的赞助。 该项目目前还在孵化中,未来可能还存在较大变化,本篇内容我们将对这个工具进行快速概览。 1 Cello的功能简介 Cello可以容易的帮助用户实现: 从头开始快速构建一个区块链...

HiBlock的博客 1141
上一篇: 区块链100讲:Hyperledger Fabric 中的链码(智能合约)
下一篇: 这个小姐姐说:你之前所知道的区块链可能都是错的
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值