0%

By Z.H. Fu
https://fuzihaofzh.github.io/blog/
In this article, we try to use LSTM to learn some sine waves and then to draw the waves all by itself. ![LSTM_denoising](/blog/images/LSTM_predict.png) ## introduction RNN(Recurrent Neural Network) is a kind of neural network which will send current information recurrently back to itself. As a result, it can "remember" something of previous samples. However common RNN can not remember too much things because of the gradient vanishing problems. When error back propagates to the previous layers, it will multiply the gradient of the activation function which is less than 1. After several steps, it decays to nearly 0. LSTM(Long Short Term Memory)[1] is one kind of the most promising variant of RNN. Some gates are introduced into the LSTM to help the neuron to choose when to forget and when to remember things. It tackle the gradient vanishing problems with some more parameters introduced. Here we use a sine wave as input and use LSTM to learn it. After the LSTM network is well trained we then try to draw the same wave all by LSTM itself. ## construct the LSTM in Theano
Read more »

By Z.H. Fu
https://fuzihaofzh.github.io/blog/
惰性求值在解释性语言中有着广泛的应用,通过惰性求值,延迟了临时变量的计算,避免了无谓的变量产生,是实现大规模计算的重要的优化手段。然而,很多惰性求值的应用仅限于一些脚本语言,本文介绍了如何用C++实现惰性求值。

什么是惰性求值?

我们先来看下面一段Python程序,在python中输入

1
2
3
4
5
a = [1,2,3]
b = [4,5,6]
c = a + b
for i in c:
print c

这个程序很快执行,但是试想一下,如果a和b都是很大的List,那么生成中间变量,再去遍历他将是一个极为浪费时间的做法,我们希望c只在求值(即print)的时候再来计算,这样能节省出产生临时变量的时间。

C++实现

我们以矩阵类来展示惰性求值的实现方法。首先我们有一个共同的基类:

Read more »

By Z.H. Fu
https://fuzihaofzh.github.io/blog/

条件数定义

在矩阵的数值计算中经常会遇到条件数的概念,条件数通常用于描述一个线性系统的稳定性,条件数越大,系统的稳定性越差。通常条件数太大的线性系统,求得的解会受到舍入误差的严重影响。下面我们来看条件数的一些概念。

条件数被定义为:

κ(A)=A2A12\kappa (A)=||A||_2||A^{-1}||_2

其中,A2||A||_2表示矩阵的二范数,定义为:

A2=maxx0Ax2x2||A||_2=\max_{x \neq 0 }\frac{||Ax||_2}{||x||_2}

因此,条件数可表示为:

κ(A)=A2A12=(maxx0Ax2x2)(minx0Ax2x2)1\kappa(A)=||A||_2||A^{-1}||_2=\left(\max_{x \neq 0 }\frac{||Ax||_2}{||x||_2}\right)\left(\min_{x \neq 0 }\frac{||Ax||_2}{||x||_2}\right)^{-1}

可以看出,他的意义就是单位向量拉伸的最大比例除以单位向量拉伸的最小比例。而这个拉伸比例就是矩阵最大和最小的奇异值,记作σn(A),σ1(A)\sigma_n(A),\sigma_1(A)

κ(A)=σn(A)σ1(A)\kappa(A)=\frac{\sigma_n(A)}{\sigma_1(A)}

条件数与奇异值

我们再来回顾一下奇异值分解(参见 理解PCA和SVD ),矩阵AA的奇异值分解为A=UΣVTA=U\Sigma V^T,其中,U,VU,V为正交单位阵,因此Ax=UΣVTx=UΣyAx=U\Sigma V^Tx=U\Sigma y,这里y=VTxy = V^Tx是对xx做一个正交变换,其模长不变,若xx为单位向量的话,yy也为单位向量。同理最后用UU来对Σy\Sigma y进行正交变换也不改变其模长,因此,最终的模长可看做是一个对角阵Σ\Sigma对一个单向量yy,进行变换的结果,而对角阵Σ\Sigma的对角元素就是奇异值,如果最大的奇异值和最小的奇异值相差较大的话,那么对一个单位向量的变换结果模长的变化范围就很大,这样的话,不同向量的计算出的数量级不一样,就会出现舍入误差的问题。

![conditionNumber1](/blog/images/conditionNumber1.jpg)
Read more »

By Z.H. Fu
https://fuzihaofzh.github.io/blog/
# Abstract This article compares four optimization approaches on the logistic regression of mnist dataset. The results of Gradient Descent(GD), Stochastic Gradient Descent(SGD), L-BFGS will be discussed in detail. We proposed a Combined Stochastic Gradient Descent with L-BFGS(CL-BFGS) which is a improved version of L-BFGS and SGD. we conclude that when dataset is small, L-BFGS performans the best. If the dataset is big, SGD is recommended.

Dataset

The mnist dataset is one of the most popular dataset in machine learning especially in handwriting recognition systems. It contains 50000 pictures of 28x28 size as the training set while 10000 as validation set and 10000 as test set. The Bench mark error rate of mnist in traditional linear classification method is 7.6%[1]. However, the result improved dramatically after the deep learning method is proposed. DNN0.35%[2], CNN0.23%[3]. In this article, we only compare the optimization method in logistic regression.

Experiment

Read more »

By Z.H. Fu
https://fuzihaofzh.github.io/blog/
## 摘要 本文主要从分解形式上讲述了PCA(Principal Component Analysis,主成分分析)和SVD(Singular Value Decomposition奇异值分解)的目的和方法,对于两种方法都给出了一种直观的理解。简单起见,本文不给出具体的应用实例。 ## PCA 主成分分析(PCA)常用于提取一系列多维样本的共同特征。那么,怎么理解特征?我们假设每个样本是由一系列的特征线性组合而成的,PCA的目的就是去找到这些特征,然后将每一个样本表示为这些特征的组合,实际上PCA找到了样本空间中的一组基,将每一个样本表示为这组基的线性组合,因此,每一个基就是一个特征。那么,特征需要满足哪些性质呢?其实就一点,特征之间的关系应该越少越好。用基来描述就是这应该是一组正交基。下面我们来看该怎么构造这组基。 ![PCA](/blog/images/20151204PCA.jpg) 我们假设我们的样本矩阵为$A_{m\times n}$每一行为一个样本,共m个样本,每一列是一个特征,共n个特征。我们来看怎么刻画特征不相关这个事情。我们可以看两个随机变量不相关是怎么刻画的,两个随机变量不相关,即他们的协方差为0,即:
Read more »

By Z.H. Fu
https://fuzihaofzh.github.io/blog/
这里主要证明一个集合一定不能与其所有子集等势,即建立集合的一一对应关系。 我们记集合为$X$,相应地,其所有子集构成的集合记作$2^X$,我们用反证法。 首先,假设$X$和$2^X$存在一一映射$f:X\rightarrow 2^X$,那么$\exists A=\{A \subset X|x \in A, x \notin f(x)\}$,这里解释下符号,$x$是$X$中的一个元素,其在$2^X$中的象为$f(x)$,而$A$是$X$的一个子集(用符号表示就是$A \subset X,A \in 2^X$),该子集中的每一个元素的象都不包含自己。那么,我们对于$2^X$中元素$A$的原象$x$,若$x \in A$,那么$x \notin f(x)$即$x \notin A$,矛盾;若$x \notin A$,那么$x \in f(x)$即$x \in A$矛盾。综上集合不能与其自身所有子集等势。 ![TikZ_sample](/blog/images/subsetmap.jpg) 注意,这个的证明和罗素悖论的证明非常相似。

By Z.H. Fu
https://fuzihaofzh.github.io/blog/
## 摘要 随着云概念的普及,越来越多的人开始使用云存储服务,与此同时提供云服务的公司也越来越多。本文给出了私人云存储服务的搭建方法,实现了利用seafile在家里假设服务器,在其他地方备份的模式;同时,由于在家里的网络是内网,外接无法访问,本文通过内网穿透的方式实现了外网对内网的访问;最后,通过nginx实现了反向代理,将外网的访问统一到80端口。

seafile服务搭建

![NN](/blog/images/seafile.jpg)
我们这里的私人存储服务采用的工具seafile实现,seafile是非常优秀的一个工具,支持在Windows,Linux和Raspberry Pi 上搭建服务,而客户端则可运行在Windows,Linux,Mac OS和Android上,实现多种平台间的数据同步。下面给出实现步骤 1、首先我们到https://www.seafile.com/download/ 上下载seafile的安装包。 2、按照服务文档http://manual-cn.seafile.com/ 安装,这里没有什么坑,都还比较顺利。

内网穿透

由于我们的云存储服务一般都放在家里,需要从外部访问,但是外部访问的地址该怎么填呢?是不是直接填自己的ip就行了?不幸的是,对大多数人来讲,这是不行的。我们先来查查自己的ip,查询ip有两种方法,一是在命令行里面输入ifconfig,二是登录http://ip.cn/ 查询,经过查询后,发现两个ip不一样,查阅资料后发现是因为家里的网络通常是被运营商再包过一层,使用的ip是运营商提供的内网ip,相当于处在了一个局域网里面,因而无法从外部直接访问,那么这个时候就需要采用内网穿透的方式来提供对外的访问。所谓的内网穿透实际上也还是需要借助外部服务器的,在这里向大家推荐一个软件叫做ngrok,其工作原理就是在他的服务器上建立一个子域名,并和本地服务器关联,所有访问外部服务器的请求都被转到了本地服务器,实现了外部访问。由于众所周知的缘故ngrok主页无法访问,好在国内有人做了一个类似的服务,下面给出实现步骤:
1、到www.tunnel.mobi 下载ngrok 1.7。
2、新建配置文件 ~/.ngrok 内容如下:

1
2
3
4
5
6
server_addr: "tunnel.mobi:44433"
trust_host_root_certs: true
tunnels:
www.yoursite.org:
proto:
http: 80
Read more »

By Z.H. Fu
https://fuzihaofzh.github.io/blog/

神经网络在学习的时候通常采用误差反馈的方法,误差反馈的实质是一种梯度下降,由于梯度下降的速度较慢,所以又通常采用SGD等方法实现对计算效率的优化。本文给出了求神经网络似然函数对所有参数导数的方法,该方法基于微分的链式法则,利用该导数实现了基于BFGS的神经网络,取得了良好的效果。同时,除了神经网络之外,该方法对其他复合函数参数的求导也同样有效。

网络结构及函数定义##

这里采用一个单隐层的神经网络作为例子,该神经网络有6个输入结点,三个隐层结点和一个输出结点,a1a_1是输入矩阵,矩阵的每行是一个样本,每列是一个特征,其数量就是输入层的结点数,这里一共有六列。结构如图所示:

NN
其传递关系如下:

\begin{align}&z_2 = a_1 w_1+b_1 \\ & a_2 = h(z_2) \\ &z_3 = a_2 w_2+b_2\\ & a_3 = h(z_3)\\ &c = l(a_3)\\ &v = M:c \end{align}

其中

\begin{align}&h(x)=\frac{1}{1+e^{-x}} \\ &l(a)=\ln(a)\circ y+\ln(1-a)\circ (1-y) \\ &M=[\frac{1}{N},\frac{1}{N},\cdots,\frac{1}{N}]^T \end{align}

Read more »

By Z.H. Fu
https://fuzihaofzh.github.io/blog/

引言

在绘制流程框图时,有许多工具可以采用,最著名的有微软的Viso,而开源的有Graphviz、PGF/TikZ,最近要再Mac上画一个流程图,Graphviz是采用dot语言的一个矢量图生成系统,但是不支持LaTeXLaTeX公式,安装也比较麻烦。PGF是用于生成矢量图的一种语言,而TikZ则是在Tex环境下的一个宏包,实现了对PGF的封装,所以我们要使用TikZ,就需要先配置LaTeXLaTeX环境,用TikZ绘制出来的图形效果非常好,原生支持所有LaTeXLaTeX语法,同时能和正文的文字字体保持高度一致,但是学习曲线略微陡峭,适合有排版强迫症的同学。那么下面我们一步一步地熟悉用TikZ来绘制流程图。

![TikZ_sample](/blog/images/tikz/TikZ_sample.svg)

环境安装与配置

我们首先要安装Tex环境,Windows系统推荐Texlive 完整安装,Mac系统推荐MacTex 完整安装后,在Windows下,已安装默认编辑器WinEdt,而在Mac下的编辑器则是TeXShop,这两个编辑器都非常好用,直接用就可以了。

第一个例子

我们先从一个最简单的例子开始:画一条直线。
  代码如下:

1
2
3
4
5
6
7
\documentclass[tikz]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw (0,0) -- (1,1);
\end{tikzpicture}
\end{document}

这样,我们得到了一个pdf文件,我们用pdf2svg工具将其转换为svg格式的矢量图。
输出:

![TikZ_s0](/blog/images/tikz/TikZ_s0.svg)

带\的都是LaTeX的宏命令,可以看到,这段代码的核心就一句话 \draw (0,0) -- (1,1); 这句话的意思就是从(0,0)到(1,1)画一条线段。我们还可以画的稍微复杂一点:

1
2
3
4
5
6
7
8
\documentclass[tikz,convert=pdf2svg]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw [color=blue!50,->](0,0) node[left]{$A$}-- node [color=red!70,pos=0.25,above,sloped]{Hello}(3,3) node[right]{$B$};
\end{tikzpicture}
\end{document}

Read more »

By Z.H. Fu
https://fuzihaofzh.github.io/blog/
  黎曼-zeta函数有着许多奇妙的应用,很难想象,一个由简单的级数之和竟能和$\pi$产生关系,而且还能表示为全体质数的一个函数。本文简单地给出了一些巧妙的应用、证明以及直观的理解。 ## Basel问题   历史上,求平方倒数的和的极限问题曾引起了众多数学爱好者的兴趣,而这一问题最终由大数学家欧拉以其非凡的数学直觉给出了解答。该问题的题目是求无穷级数的和: $$S=\sum_{n=1}^\infty\frac{1}{n^2}$$ 欧拉首先给出了一个不太严谨,但非常巧妙的证明,在这个证明中,他将有限多项式的观察推广到了无穷级数(该过程在当时并未得到证明,该证明由维尔斯特拉斯在100年后给出)。 欧拉观察到 $$\sin x = x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + \cdots$$ 两边同除$x$,得 $$\frac{\sin x}{x} = 1 - \frac{x^2}{3!} + \frac{x^4}{5!} - \frac{x^6}{7!} + \cdots$$ 而函数$\frac{\sin x}{x}= 0$的根为$x = n\pi, n = \pm1, \pm2, \pm3, \dots$,我们把这个函数表示成类似于多项式因式分解的形式有 $$\begin{align} \frac{\sin x}{x} & = \left(1 - \frac{x}{\pi}\right)\left(1 + \frac{x}{\pi}\right)\left(1 - \frac{x}{2\pi}\right)\left(1 + \frac{x}{2\pi}\right)\left(1 - \frac{x}{3\pi}\right)\left(1 + \frac{x}{3\pi}\right) \cdots \\ & = \left(1 - \frac{x^2}{\pi^2}\right)\left(1 - \frac{x^2}{4\pi^2}\right)\left(1 - \frac{x^2}{9\pi^2}\right) \cdots. \end{align}$$ 我们观察这个积展开后的$x^2$项,为 $$-\left(\frac{1}{\pi^2} + \frac{1}{4\pi^2} + \frac{1}{9\pi^2} + \cdots \right) = -\frac{1}{\pi^2}\sum_{n=1}^{\infty}\frac{1}{n^2}$$ 而注意到最开始泰勒展开把$x$除到左边之后,右边的$x^2$项的系数为$-\frac{1}{3!}=-\frac{1}{6}$,所以有 $$-\frac{1}{6}=-\frac{1}{\pi^2}\sum_{n=1}^{\infty}\frac{1}{n^2}$$ $$\sum_{n=1}^{\infty}\frac{1}{n^2} = \frac{\pi^2}{6}$$ 惊奇地发现,平方倒数之和竟然和$\pi$有关系,我们再将这个问题推广一下。
Read more »