-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathindex.html
410 lines (284 loc) · 17.4 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Julia中文社区</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta property="og:type" content="website">
<meta property="og:title" content="Julia中文社区">
<meta property="og:url" content="http://juliacn.com/index.html">
<meta property="og:site_name" content="Julia中文社区">
<meta property="og:locale" content="default">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Julia中文社区">
<link rel="alternate" href="/atom.xml" title="Julia中文社区" type="application/atom+xml">
<link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" integrity="sha384-XdYbMnZ/QjLh6iI4ogqCTaIjrFk87ip+ekIjefZch0Y+PvJ8CDYtEs1ipDmPorQ+" crossorigin="anonymous">
<link rel="stylesheet" href="/css/styles.css">
</head>
<body>
<nav class="navbar navbar-inverse">
<div class="container">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#main-menu-navbar" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="main-menu-navbar">
<ul class="nav navbar-nav">
<li><a class="active"
href="/index.html">主页</a></li>
<li><a class=""
href="/julialang/">Julia语言</a></li>
<li><a class=""
href="/meetups/">活动</a></li>
<li><a class=""
href="/downloads/">下载</a></li>
<li><a class=""
href="/docs/">文档</a></li>
<li><a class=""
href="/about/">关于</a></li>
<li><a class=""
href="/archives/">归档</a></li>
</ul>
<!--
<ul class="nav navbar-nav navbar-right">
<li><a href="/atom.xml" title="RSS Feed"><i class="fa fa-rss"></i></a></li>
</ul>
-->
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
<div class="container">
<div class="blog-header">
<h1 class="blog-title">Julia中文社区</h1>
</div>
<div class="row">
<div class="col-sm-8 blog-main">
<article id="post-common-random-variables" class="article article-type-post" itemscope itemprop="blogPost">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/blog/2018/07/23/common-random-variables/">common-random-variables</a>
</h1>
</header>
<div class="article-meta">
<div class="article-datetime">
<a href="/blog/2018/07/23/common-random-variables/" class="article-date"><time datetime="2018-07-23T11:35:03.000Z" itemprop="datePublished">2018-07-23</time></a>
</div>
</div>
<div class="article-inner">
<div class="article-entry" itemprop="articleBody">
<p>动机
当我们模拟带随机成分的模型时,它通常是有利于分解成如下面这样的结构:</p>
<ol>
<li>含有需要我们来描述结构关系的参数θ,</li>
<li>含有独立于参数的噪音 ε,</li>
<li>含有能够生成可观察数据或矩阵的函数 f(θ,ε)</li>
</ol>
<p>这样做可以让我们使用常见的随机变量(也就是常见的随机数),这是一种常见技巧能简单地固定ε,尝试不同的θ。这样做可使函数f成为可微分的,
使f能用基于导数的优化算法(例如,最大似然法或MAP)或基于MCMC方法的衍生方法。并且它还用于减少模拟矩的方差。</p>
<p>在Julia中实现这种技术时,我经常创建一个能保存参数ε的盒子结构,它会分配一个需原地更新的数组空间。由于 <code>DynamicHMC.jl</code> 的
再版设计在出现时会以更加规范的方式容纳模拟似然方法,所以我想探索其他选择,其中最重要的是<code>StaticArrays.jl</code>。</p>
<p>在这里,我会用一个简单的玩具模型对Julia v0.6.2的替代品进行基准测试。对比TL,DR来说:<code>StaticArrays.jl</code> 快150倍,
并且这里不依赖于所用的静态数组的可变性,甚至每次重新分配 时都会产生新的ε 。</p>
<p>设置问题:
简单设置一下:我们准备出$M$个观察对象,然后噪音是:</p>
<p>εi,j∼N(0,1)for i=1,…,M;j=1,…,7.
我们的参数是μ和σ,对于每个i我们来算</p>
<p>这是非线性变换后的样本平均值。然后这个7是偶然选取的,它来自简化我正在处理的实际问题。我们对Ai的样本平均值感兴趣。我刻意避免只是微优化每个版本,这样才能反映出怎么处理现实生活中的问题。
我们将这个通用接口编代码如下:
using BenchmarkTools
using StaticArrays
using Parameters</p>
<h1>common interface</h1>
<p>"Dimension of noise <code>ϵ</code> for each observation."
const EDIM = 7</p>
<p>«»"
Common random variables. The user needs to define</p>
<ol>
<li><code>observation_moments</code>, which should use <code>observation_moment</code>,</li>
<li><code>newcrv = update!(crv)</code>, which returns new common random variables,
potentially (but not necessarily) overwriting <code>crv</code>.
"""
abstract type CRVContainer end</li>
</ol>
<p>observation_moment(ϵ, μ, σ) = mean(@. exp(μ + σ * ϵ))</p>
<p>average_moment(crv::CRVContainer, μ, σ) = mean(observation_moments(crv, μ, σ))</p>
<p>"Calculate statistics, making <code>N</code> draws, updating every <code>L</code>th time."
function stats(crv, μ, σ, N, L)
_stat() = (N % L == 0 && (crv = update!(crv)); average_moment(crv, μ, σ))
[_stat() for _ in 1:N]
end</p>
<p>我写stats函数的方式代表了我如何使用HMC / NUTS:在相同轨迹上的模拟力矩就用相同的ε来计算,ε也会根据每一条轨迹来更新。当然,参数会沿轨迹变化,不过这里它们没有变化,但这并不影响基准。
update! 函数的语义能够直接修改功能和风格。</p>
<p>使用一个预分配矩阵
这是我写代码中用到的主要方法。1 ε在矩阵中的列里,将它们映射为片状更好,然后在用到 observation_moment时会被映射。
update! 函数重写了这些内容。
""«
Common random variables are stored in columns of a matrix.
»""
struct PreallocatedMatrix{T} <: CRVContainer
ϵ::Matrix{T}
end</p>
<p>PreallocatedMatrix(M::Int) = PreallocatedMatrix(randn(EDIM, M))</p>
<p>update!(p::PreallocatedMatrix) = (randn!(p.ϵ); p)</p>
<p>observation_moments(p::PreallocatedMatrix, μ, σ) =
vec(mapslices(ϵ -> observation_moment(ϵ, μ, σ), p.ϵ, 1))
利用静态向量
我们在各种静态向量实现间共享了以下内容:
"Common random variables as a vector of vectors, in the <code>ϵs</code>."
abstract type CRVVectors <: CRVContainer end</p>
<p>observation_moments(p::CRVVectors, μ, σ) =
map(ϵ -> observation_moment(ϵ, μ, σ), p.ϵs)
我发现在这里使用映射比使用上面说的映射切片要更加直观。
静态向量,预分配容器
在使用静态向量的第一个版本中, 我们将 SVector 保留在 Vector中,并适时更新。.
struct PreallocatedStaticCRV{K, T} <: CRVVectors
ϵs::Vector{SVector{K, T}}
end</p>
<p>PreallocatedStaticCRV(M::Int) =
PreallocatedStaticCRV([@SVector(randn(EDIM)) for _ in 1:M])</p>
<p>function update!(p::PreallocatedStaticCRV)
@unpack ϵs = p
@inbounds for i in indices(ϵs, 1)
ϵs[i] = @SVector(randn(EDIM))
end
p
end
可变静态向量与重写
我们修改这个来使用可变向量,这应该没有什么区别。
struct MutableStaticCRV{K, T} <: CRVVectors
ϵs::Vector{MVector{K, T}}
end</p>
<p>MutableStaticCRV(M::Int) =
MutableStaticCRV([@MVector(randn(EDIM)) for _ in 1:M])</p>
<p>function update!(p::MutableStaticCRV)
@unpack ϵs = p
@inbounds for i in indices(ϵs, 1)
randn!(ϵs[i])
end
p
end
每次分配的静态向量
最后,这就是第三版,
struct GeneratedStaticCRV{K, T} <: CRVVectors
ϵs::Vector{SVector{K, T}}
end</p>
<p>GeneratedStaticCRV(M::Int) =
GeneratedStaticCRV([@SVector(randn(EDIM)) for _ in 1:M])</p>
<p>update!(p::GeneratedStaticCRV{K, T}) where {K, T} =
GeneratedStaticCRV([@SVector(randn(T, K)) for _ in indices(p.ϵs, 1)])
结果
运行如下代码:
@btime mean(stats(PreallocatedMatrix(100), 1.0, 0.1, 100, 10))
@btime mean(stats(PreallocatedStaticCRV(100), 1.0, 0.1, 100, 10))
@btime mean(stats(MutableStaticCRV(100), 1.0, 0.1, 100, 10))
@btime mean(stats(GeneratedStaticCRV(100), 1.0, 0.1, 100, 10))
我们获得:</p>
<p>作为将来改进的预览,我在当前的master 上尝试了 PreallocatedMatrix (master 将成为Julia v0.7),这获得了3.5 ms (2.46 MiB)的结果, 这正是我们希望看到的。2
结论是, StaticArrays 简化了逻辑,同时加速了代码的速度.。我特别喜欢上一版本(GeneratedStaticCRV), 因为它不需要事先考虑类型。. 虽然这里的例子很简单,但实际上我会使用自动微分,这使得提前确定缓冲区类型更具挑战性。. 我希望将来我会转换到更“无缓冲”的风格,并相应地为DynamicHMC.jl设计界面。</p>
</div>
<footer class="article-footer">
<a data-url="http://juliacn.com/blog/2018/07/23/common-random-variables/" data-id="cjk278dmy00007k61wi92qd13" class="article-share-link">
<i class="fa fa-share"></i> Share
</a>
</footer>
</div>
</article>
<article id="post-why-we-created-julia" class="article article-type-post" itemscope itemprop="blogPost">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/blog/2018/06/30/why-we-created-julia/">我们为什么创造Julia语言</a>
</h1>
</header>
<div class="article-meta">
<div class="article-datetime">
<a href="/blog/2018/06/30/why-we-created-julia/" class="article-date"><time datetime="2018-06-30T06:58:24.000Z" itemprop="datePublished">2018-06-30</time></a>
</div>
</div>
<div class="article-inner">
<div class="article-entry" itemprop="articleBody">
<blockquote>
<p>这是一篇重译,参考了2012年的一篇豆瓣(链接在最后)。</p>
</blockquote>
<p>简短来讲,是因为我们很贪婪。</p>
<p>我们之中有些是使用MATLAB的重量级用户,有些是来自Lisp的极客,还有一些是来自Python和Ruby的魔法师,甚至还有来自Perl社区的大魔法师。我们之中还有从胡子都没长齐时就开始使用Mathematica的。其中的有些人现在都没长胡子喱!我们像是疯了一样用R画了越来越多的图,而C是我们的硬核摇滚(也有大杀器之意)。</p>
<p>我们热爱所有这些语言,他们实在很好很强大。在我们从事的领域(科学计算,机器学习,数据挖掘,大规模线性代数计算,分布式和并行计算)中,每一种语言都对某一项工作的一项特定需求非常完美,但是却无法胜任其它需求。于是使用什么语言都需要我们去权衡。</p>
<p>而我们很贪婪,我们还想要更多。</p>
<p>我们想要的是一个自由开源的语言,并且它同时拥有C的速度和Ruby的动态性;我们想要一个具有<a href="">同像性</a>(可以将语言的脚本本身当作数据进行处理)的语言,它有着真正的和lisp一样的宏,但是却像Matlab一样有着显然的,类似于数学表达式的标记;我们想要一个既可以像Python一样作为通用编程语言的工具,又可以像R那样适用于统计分析,能像Perl那样自然地处理字符串,能像Matlab那样给力地处理矩阵运算,它还要能像shell一样作为胶水将各种程序粘合在一起;我们想要一个简单易学的语言,同时它还能让最苛刻的魔法师们(hackers)开心。我们希望它是交互式的,但我们也希望它能被编译。</p>
<p>(我们刚刚有提它要和C一样快嘛?!)</p>
<p>当我们在构思这些需求的时候,我们发现它还得有Hadoop这样强大的分布式能力,却不想要Hadoop里面那些冗长Jave和XML模板,更不想被被迫在几个GB的日志文件和几百台机器里找bug。我们不想要那些令人费解的层次结构。我们想让简单的标量循环能被编译成仅用寄存器和一块CPU的干净的机器码。我们希望简单地写下<code>A*B</code>就能够在成千上万的机器上用成千上万地运算来计算这个庞大的矩阵乘法。</p>
<p>如无必要,那就不用声明类型。但当我们需要多态函数(polymorphic functions)时,我们也想要用泛型编程(generic programming)仅仅书写一次算法,就能够在无限多的类型上使用。我们想要多重派发(multiple dispatch)来为一个函数所有可能的参数选出最佳的执行方法。这些参数可能有着不同定义,不同类型,但是却有着相同功能。在拥有以上能力的同时,我们还希望这种语言简单,干净。</p>
<p>要求有点多,是不是?</p>
<p>尽管我们意识到了自己有多贪心,我们还是想要拥有这些功能。大概在两年半之前,我们开始创造这种能满足我们贪念的语言。它还没有完工——但是已经可以发布一个1.0版本了(其实等了6年才要发布)——我们创造的这个语言叫做Julia。它已经实现了我们这次乱七八糟需求的90%,而现在她需要来自更多人的乱七八糟的需求,来让她走得更远。如果你也是一位贪心不足,不可理喻,需索无度的码场二逼青年,希望你能来试试这个东东。</p>
<p>
作者:Jeff Bezanson, Stefan Karpinski, Viral Shah, Alan Edelman
<br>
译者:Roger
<br>
翻译自:<a href="https://julialang.org/blog/2012/02/why-we-created-julia" target="_blank" rel="noopener">Why we create Julia</a>
<br>
参考自:<a href="https://www.douban.com/note/203945680/" target="_blank" rel="noopener">豆瓣:为什么我们要创造Julia</a>
</p>
</div>
<footer class="article-footer">
<a data-url="http://juliacn.com/blog/2018/06/30/why-we-created-julia/" data-id="cjk278dn200027k61ckbyw3l6" class="article-share-link">
<i class="fa fa-share"></i> Share
</a>
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/官方博客翻译/">官方博客翻译</a></li></ul>
</footer>
</div>
</article>
</div>
<div class="col-sm-3 col-sm-offset-1 blog-sidebar">
<div class="sidebar-module sidebar-module-inset">
<h4>About</h4>
<p>这里是<a href="/about">Julia中文社区</a>,关于Julia语言请点击:<a href="/julialang">Julia语言</a>, 关于社区,请点击:<a href="/about">Julia中文社区</a>。QQ群:316628299</p>
</div>
<div class="sidebar-module">
<h4>Tags</h4>
<ul class="sidebar-module-list"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/tags/官方博客翻译/">官方博客翻译</a><span class="sidebar-module-list-count">1</span></li></ul>
</div>
<div class="sidebar-module">
<h4>Tag Cloud</h4>
<p class="tagcloud">
<a href="/tags/官方博客翻译/" style="font-size: 10px;">官方博客翻译</a>
</p>
</div>
<div class="sidebar-module">
<h4>Archives</h4>
<ul class="sidebar-module-list"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2018/07/">July 2018</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2018/06/">June 2018</a><span class="sidebar-module-list-count">1</span></li></ul>
</div>
<div class="sidebar-module">
<h4>Recents</h4>
<ul class="sidebar-module-list">
<li>
<a href="/blog/2018/07/23/common-random-variables/">common-random-variables</a>
</li>
<li>
<a href="/blog/2018/06/30/why-we-created-julia/">我们为什么创造Julia语言</a>
</li>
</ul>
</div>
</div>
</div>
</div>
<footer class="blog-footer">
<div class="container">
<div id="footer-info" class="inner">
© 2018 JuliaCN<br>
Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
</div>
</div>
</footer>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js" integrity="sha384-8gBf6Y4YYq7Jx97PIqmTwLPin4hxIzQw5aDmUg/DDhul9fFpbbLcLh3nTIIDJKhx" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
<script src="/js/script.js"></script>
</body>
</html>