Simplism Life

less is more.


  • 首页

  • 标签

  • 归档

  • 关于

神经网络与机器学习笔记

发表于 2019-04-14 | 更新于: 2019-04-14 | 阅读次数:

知识表示的规则

规则1

相似类别中的相似输入通常应产生网络中的相似的表示,因此可以归入同一类中。

相似性的测量方法
欧几里得距离
$$
d(x_i,x_j) = || x_i - x_j || = \left[\sum_{k=1}^m (x_{ik} - x_{jk})^2\right]^{1/2}
$$

内积 给定一对相同维数的向量 $x_i$,$x_j$,他们的内积是 $x_i^Tx_j$,定义为向量 $x_i$ 对向量 $x_j$ 的投影
$$
(x_i,x_j) = x_i^Tx_j = \sum_{k=1}^mx_{ik}x_{jk}
$$

欧几里得距离 $||x_i - x_j||$ 越小,向量 $x_i$ 和 $x_j$ 越相识,内积 $x_i^Tx_j$ 越大

规则2

网络对可分离为不同种的输入向量给出差别很大的表示

规则3

如果某个特征很重要,那么网络表示这个向量将设计大量神经元

规则4

如果存在先验信息和不变性,应该将其附加在网络设计中,这样就不必学习这些信息而简化网络设计

怎样在神经网络设计中加入先验信息

  1. 通过使用称为接收域(receptive field)的局部连接,限制网络结构
  2. 通过使用权值共享(weight-sharing),限制突触权值的选择

如何在神经网络设计中建立不变性

  1. 结构不变性 同一输入变换后必须得到同样的输出
  2. 训练不变性 用一些来自同一目标的不同样本训练网络,这些样本代表目标的不同变换
  3. 不变特征空间 提取表示输入数据本质信息内容特征的特征,并且这些特征对输入的变换保持不变

简单生活

发表于 2018-07-04 | 更新于: 2018-09-07 | 阅读次数:

简单生活,享受独处。

很早就知道断舍离,知道极简的概念了。不过对于我来说,每个购物节都是买买买,囤囤囤。渐渐的才发现,似乎已经被物欲控制了生活。

也就今年才开始认真考虑进行物质的极简。

可是转眼半年过去了,每天忙碌却不知所为。为了加班而加班,生活过得琐碎又无味。没有朝九晚五,只有九九六。没有浪迹天涯,只有裹足不前。计划读的书都没读完,计划写的文章也没写。就这样,半年过去了。

每天忙于工作,或是忙于社交。其实没那么多有效的社交。大家都在讨好别人,努力营造自己是社交名片。吵吵闹闹,谁能听见自己内心的声音呢?

(听说写不下的时候,硬写就好了)

好久也没写过日记了,打字的这会儿,突然意识到了自己的浅薄。没有输入,何来输出。

其实一直借口没空看书,但是很多时间都是白白浪费了。网络是一个无底洞,不停的吞噬人的注意力。无尽的碎片信息,肆意的散发着焦虑。

昨天注册了这个新域名,又把网站好好搞了下。就是希望能够坚持下去。这下半年的计划:

  1. 每周读一本书
  2. 每周至少写一篇博客(破功了)
  3. 践行极简,简单生活

机器学习笔记

发表于 2018-01-13 | 更新于: 2019-01-21 | 阅读次数:

概念

  • 召回率: 检索出的相关样本数和样本库中所有相关样本数的比率,衡量查全率。
  • 精确率: 检索出的相关样本数和检索出的样本总数的比率,衡量查准率。

分类和回归的训练过程

  1. 输入样本和训练标签。
  2. 建立映射假说的某个 $$y=f(x)$$ 的模型。
  3. 求解出全局的损失函数 Lose 和待定系数 w 的映射关系,$$Loss=g(w)$$ 。
  4. 通过迭代逐步降低 Loss ,最终找到一个 w 使得精确率和召回率满足当前场景需要。尤其指验证数集上的表现。

神经元

通常由两部分组成:

  1. 线性模型 $$f(x)=wx+b$$
  2. 激励函数 在一个神经元当中跟随在$$f(x)=wx+b$$函数之后,用来加入一些非线性因素。

常见激励函数

  1. Sigmoid函数
    $$f(x)= {1 \over {1+e^{-(wx+b)}}}$$
    也可以写成
    $$z=wx+b \,, f(z)={1 \over {1+e^{-z}}}$$

  2. Tanh函数 也叫双正切函数,表达式如下
    $$tanh(x)={e^x-e^{-x} \over e^x+e^{-x}}$$

  3. ReLU函数
    ReLU函数是目前大部分卷积神经网络 CNN(convolutional neural networks) 中喜欢使用的激励函数,它的全名是 rectified linear units.
    $$y=max(x,0)$$
    这个函数是原点左侧斜率为0,右侧斜率为1的直线。x小于0时输出一律为0,x大于0时输出就是输入值。

  4. Linear函数
    Linear函数在实际应用中并不太多,因为如果网络中前面的线性层引入是是线性关系,后面的激励层还是线性关系,就会让网络无法很好地拟合非线性特性的关系,从而发生严重的欠拟合现象。函数表达式为
    $$f(x)=x$$

神经网络

由多个神经元(神经节点)首尾连接形成一个类似于网络的结构来协同工作,这样的网络可称为神经网络。
一个神经网络中通常有输入层(input layer)、隐藏曾(hidden layer)、输出层(ouput layer)。

前馈神经网络( feedforward neural network )

在这个网络中,各神经元从输入层开始,接收前一级输入,并输出到下一级,直至输出层。整个网络无反馈,可以用一个有向无环图( directed acyclic graph, DAG )表示。
通常所说的前馈神经网络有两种:

  1. Back Propagation Network 方向传播网络,简称BP网络
  2. BRF Network 径向基函数神经网络

机器学习导论

监督学习

什么是费曼技巧?

发表于 2018-01-13 | 更新于: 2018-01-13 | 阅读次数:

是一种通过教会别人来使自己掌握新知识的技巧

步骤:

  1. 确定目标,即你要学习和教会别人的知识、概念。
  2. 尝试将这个知识用自己的话教给别人,使其能够理解和接受。
  3. 如果发现有自己不理解或者无法解释清楚的地方,立刻去查资料学习。
  4. 归纳总结,将这个知识点用更简洁明了的话来概括。

书非借不能读?书非图书馆不能读?

发表于 2018-01-07 | 更新于: 2018-01-07 | 阅读次数:

书非借不能读也。

在图书馆看书的时候想到这句话,想来只是个借口吧。刚过去的2017,买了很多书,也借了很多书,读完的却寥寥无几,而因超期还书产生的费用也有好几十了。

以往读书从来不做笔记,今天突然想做思维导图,于是打开了ProcessOn。看到上面在搞促销砍价活动,想着以后多做笔记,多画导图,买一个倒也不错。于是发了砍价链接到群里,作为一个怕麻烦别人的人,当然也顺便发了个红包。只是没想到,领红包的人很多,帮忙点一下的却没几个。

此时在图书馆里反省,是我对别人要求太多了吗,别人没义务为你红包做什么。所以以后就别发红包了,直接买就好了,这样省事些,也不欠人情。

在我买了ProcessOn会员之后突然有点后悔了,因为觉得自己可能用不了那么多功能,又有别的替代方案,竟想着去退款。去看了下,好像没有可以退款的地方。

说回到书非借不能读,现在还有个说法是书非买不能读。过去的一年,可以说为知识付费兴起的一年。从知乎live、值乎、各种公众号、付费视频、付费读书等一些付费学习中可见一斑。也许是世界变化太快,每个人都有一种知识不够用的焦虑感。花了钱不一定买得到知识,但因为给了钱了,为了让这笔钱花得物有所值,会努力督促自己去学去用。想来我冲动之下买了ProcessOn会员也是因这种焦虑感。

然而,袁枚老先生说的书非借不能读,对应的是当时物质匮乏,读书不是一件易事。买不起书的人,借来的书都会约好还书时间,因紧迫而读。所以后来有钱买书之后反而不紧迫,不急着读,反而因此拖延了。对比现在,买书实在太易,借书也不难,而且超期也无所谓,加上手机和互联网对注意力的分散,反而越来越难以静下心来读书了。

现在,大概也就在图书馆这些有读书学习氛围的地方,才能静下心来好好看书学习吧。或者可以尝试在固定的时间关掉手机电脑,用来静心读书。

因此不妨把这句话改成:非图书馆不能读书。

雨夜,2018杂想

发表于 2018-01-07 | 更新于: 2018-01-07 | 阅读次数:

刚看完《银翼杀手2049》,心里好多乱七八糟的念头,也不全是关于这部电影的。因为近来加班较多,累是一方面,另一方面是越来越焦虑。闲暇之余都恨不得爬山减压。

刚过去的2017,其实过得并不如意,像是白过了一年。曾经有的,想要做的事情都没完成。关于读书,关于写作,关于学习,关于爱情,关于生活。压力太大,却不知从何处来。项目进度过慢,这个锅我觉得应该产品经理来背,当然我们没有产品经理,所以这个锅部门经理背。因为需求改得太魔幻,我也不知道说啥了。这一年,从做安卓到做桌面客户端再到做网页再回到做安卓再到做桌面,感觉像走马观花一样。结果没一样能完成的。原本有些东西做下去就能出成果的,非得做一半又抛弃。技术应该服务于产品,而不应该不断更换技术。

去年年初的时候就想着要把《代码大全》看完。如今还在开头的地方,甚至已经忘了看过的内容了。曾想过好好写博客,好好写日记的也是荒废了。今年应该列一个计划,把想要做的事情都完成了。还要多看书,多写博客,即使不是技术的也可以写,就当是记录生活了。

说到底还是时间太少,或许会减少户外活动的时间,多带书出门。多实践,多码字,多思考。希望2018不再荒废。

最后,《银翼杀手2049》真的很好看。虽说看这个是为了减压,不过里面关于复制人不由得让我想到AI。人工智能在飞速发展,如果它们有了思想,我们又将如何对待?

Qml实现ListView拖动排序

发表于 2017-05-11 | 更新于: 2017-05-11 | 阅读次数:

列表拖动排序在很多应用中都存在, 在 Qt Quick 中如何实现呢。网上查了下没有太多相关资料,于是决定自己写一个。

原理

MouseArea 中可以可以设置 DragEvent 来对某个 Item 进行拖动。Drag 这个类一般附着在可能被拖动的 Item 上,用来设置相关的信息。它提供了很多附加属性。如

  • Drag.active: bool 这个属性用来指示控件是否正在被拖动。可以用来绑定 MouseArea 的 MouseArea::drag 属性,当用户拖动鼠标的时候就会产生 drag 事件。
  • Drag.target : Object 当 active 为 true (拖动处于活跃状态)时,这个属性保存最后一个被拖动的 dragged item。

DropArea 定义了一个可以接收拖放的区域。它的 entered 信号在有物体被拖入区域时发射,exited 信号在物体被拖出区域时发射,当物体在区域内被拖着来回移动时会不断发射 positionChanged 信号,当用户释放了物体,dropped 信号被发射。

在这个例子中,我们需要在整个 ListView 中填充一个 DropArea 用来接收释放的 Item。Item 中绑定 MouseArea 的 drag 事件。释放的时候计算相应的位置并把拖动位置的 Item 移到释放位置。需要注意的是列表滚动之后要加上滚动的距离。

实现

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
Item {
id:root
anchors.fill: parent
ListView {
id: listView
width: parent.width / 2
height: parent.height
property int dragItemIndex: -1
ScrollBar.vertical: ScrollBar{id:scrollBar}

DropArea {
id: dropArea
anchors.fill: parent
onDropped: {
// 获取释放时listView的targetIndex, 需要加上滚动的高度
var targetIndex = listView.indexAt(drag.x, drag.y + listView.contentY)
listView.model.move(listView.dragItemIndex, targetIndex, 1)
listView.dragItemIndex = -1;
}
}

model: ListModel {
Component.onCompleted: {
for (var i = 0; i < 30; ++i) {
append({value: i});
}
}
}

delegate: Item {
id: delegateItem
width: listView.width
height: 30

Rectangle {
anchors.fill: parent
Label {
text: index+1
anchors.verticalCenter: parent.verticalCenter
}

Rectangle {
id: dragRect
width: listView.width-50
height: 30
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
color: "salmon"
border.color: Qt.darker(color)

Text {
anchors.centerIn: parent
text: modelData
}

MouseArea {
id: mouseArea
anchors.fill: parent
drag.target: dragRect
drag.axis: Drag.YAxis // 只允许沿Y轴拖动

drag.onActiveChanged: {
if (mouseArea.drag.active) {
listView.dragItemIndex = index;
}
dragRect.Drag.drop();
}
}

states: [
State {
when: dragRect.Drag.active
ParentChange {
target: dragRect
parent: root
}

AnchorChanges {
target: dragRect
anchors.horizontalCenter: undefined
anchors.verticalCenter: undefined
}
}
]

Drag.active: mouseArea.drag.active
Drag.hotSpot.x: dragRect.width / 2
Drag.hotSpot.y: dragRect.height / 2
}

}
}
}

}

统计学习三要素(笔记)

发表于 2017-05-09 | 更新于: 2019-07-02 | 阅读次数:

统计学习方法都是由模型、策略和算法构成的,可简单表示为
方法 = 模型 + 策略 + 算法
下面论述监督学习中的统计学习方法三要素。

模型

统计学习方法首要考虑的问题是学习什么样的模型。在监督学习过程中,模型就是所要学习的条件概率分布或决策函数。模型的假设空间(hypothesis space)包含所有可能的条件概率分布或决策函数。
假设空间用$F$表示,假设空间可以定义为决策函数的集合
$$
F={f\;|\;Y=f_\theta(X),\theta \in R^n}
$$
也可以定义为条件概率的集合
$$
F={P\;|\;P(Y|X),\theta \in R^n}
$$
参数向量$\theta$取值于$n$维欧氏空间 $R^n$,也称为参数空间(parameter space)。

策略

统计学习的目标在于从假设空间中选取最优模型。

1. 损失函数和风险函数

损失函数(loss function):度量模型一次预测的好坏,记作$L(Y,f(X))$
常用的损失函数有几种

  1. 0-1损失函数(0-1 loss function)
    $$
    L(Y,f(X)) =\begin{cases}
    1, & Y \neq f(X) | 0, & Y = f(X) \end{cases}
    $$
  2. 平方损失函数(quadratic loss function)
    $$L(Y,f(X))=(Y-f(X))^2$$
  3. 绝对损失函数(absolute loss function)
    $$L(Y,f(X))=|Y-f(X)|$$
  4. 对数损失函数(logarithmic loss function)
    $$L(Y,P(Y|X))=-log P(Y|X)$$

风险函数(risk function) 或 期望损失(expected loss):度量平均意义下模型预测的好坏。

损失函数值越小,模型就越好。由于模型的输入、输出$(X,Y)$是随机变量,遵循联合分布$P(X,Y)$,所以损失函数的期望是
$$R_{exp}(f)=E_P[L(Y,f(X))]=\int_{x \times y}L(y, f(x))P(x,y)dx\,dy$$

给定一个训练数据集
$$T={(x_1,y_1),(x_2,y_2),…,(x_N,y_N)}$$
模型$f(X)$关于训练数据集的平均损失称为经验风险(empirical risk)或经验损失(empirical losss),记作$R_{emp}$:
$$R_{emp}(f) = {1 \over N} \sum_{i=1}^N L(y_i, f(x_i)) $$

期望风险$R_{exp}(f)$是模型关于联合分布的期望损失,经验风险$R_{emp}(f)$是模型关于训练样本的平均损失。根据大数定律,当样本容量$N$趋于无穷时,经验风险$R_{emp}(f)$趋于期望风险$R_{exp}(f)$。所以一个很自然的想法就是用经验风险估算期望风险。但是,由于现实中训练样本数目有限,甚至很小,所以用经验风险估算期望风险常常并不理想,要对经验风险进行一定的矫正。这就关系到监督学习的两个基本策略:经验风险最小化和结构风险最小化。

2. 经验风险最小化与结构风险最小化

经验风险最小化(empirical risk minimization, ERM)的策略认为,经验风险最小的模型是最优模型。即
$$ \min_{f \in F}\;{1 \over N}\sum_{i=1}^N L(y_i, f(x_i))$$
其中,$F$是假设空间。极大似然估计(maximum likelihood estimation) 就是经验风险最小化的例子。

结构风险最小化(structural risk minimization, SRM)是为了防止过拟合而提出来的策略。结构风险最小化等价于正则化(regularization)。结构风险在经验风险上加上表示模型复杂度的正则化项(regularizer)或罚项(penalty term)。在假设空间、损失函数以及训练数据集确定的情况下,结构风险的定义是
$$ R_{srm}(f) = {1 \over N}\sum_{i=1}^N L(y_i, f(x_i)) + \lambda J(f) $$
其中$J(f)$为模型的复杂度,是定义在假设空间$F$上的泛函。模型$f$越复杂,复杂度$J(f)$就越大;反之亦然。$\lambda \ge 0$ 是系数,用以权衡经验风险和模型复杂度。结构风险小需要经验风险和模型复杂度同时小。结构风险小的模型往往对训练数据及未知的测试数据都有比较好的预测。
比如,贝叶斯估计中的 最大后验概率估计(maximum posterior probability estimation,MAP) 就是结构风险最小化的一个例子。
结构风险最小化即
$$ \min_{f \in F} {1 \over N} \sum_{i=1}^N L(y_i, f(x_i)) + \lambda J(f) $$

这样,监督学习问题就变成了经验风险或结构风险函数的最优化问题。

算法

算法是指学习模型的具体计算方法。
统计学习基于训练数据集,根据学习策略,从假设空间中选择最优模型。算法的作用即用于求解该最优模型。
统计学习问题可归结为最优化问题,统计学习的算法成为求解最优化问题的算法。可以利用已有的最优化算法,有时也需要开发独自的最优化算法。

Qml中实现可伸展布局

发表于 2017-05-09 | 更新于: 2017-05-09 | 阅读次数:

公司的项目中需要用Qt写一个桌面软件,因为C++还不很熟悉,因此用QML来写界面。不过相关的资料比较少。除了官方文档基本上找不到第三方控件。

今天要实现的是一个点击伸展和收缩的控件,找了一遍没找到相关的实现,只能自己写了。

原理

自定义一个Item,包裹一个按钮和一个扩展区。点击按钮的时候伸展和收缩扩展区的高度, 并在高度变化的时候添加一个动画效果。实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//FileName: ExpandableLayout.qml
Rectangle {
property alias title: draw_title.text
property alias frame: loader.sourceComponent
property int frameHeight: 120
height: draw_title.height + loader.height

Button {
id: draw_title
onClicked: {loader.height = loader.height === 1? frameHeight: 1}
}

Loader {
anchors.top: draw_title.bottom
width: draw_title.width
height: 1
id: loader

Behavior on height {
NumberAnimation { duration: 300; easing.type: Easing.OutBack }
}
}
}

使用

1
2
3
4
5
6
7
ExpandableLayout {
title: "点我"
frameHeight: 90
frame: Rectangle {
color: "red"
}
}

Qml中使用SystemTrayIcon实现系统托盘小图标

发表于 2017-05-08 | 更新于: 2017-05-08 | 阅读次数:

SystemTrayIcon 可以在Qml中定义一个显示在系统托盘区域的小图标。

Qt5.8开始,官方提供了这一实验性的功能。

导入方式

1
import Qt.labs.platform 1.0

创建系统托盘图标

很多桌面系统都提供了一个托盘和消息通知区域,用来显示应用图标和消息。

下面的例子展示了如何创建一个 SystemTrayIcon,以及如何使用 activated() 信号来触发窗体事件。

1
2
3
4
5
6
7
8
9
10
SystemTrayIcon {
visible: true
iconSource: "qrc:/images/tray-icon.png"

onActivated: {
window.show()
window.raise()
window.requestActivate()
}
}

使用菜单

SystemTrayIcon 可以用来创建一个触发的菜单。

下面的例子实现了一个系统托盘图标的菜单。

1
2
3
4
5
6
7
8
9
10
11
SystemTrayIcon {
visible: true
iconSource: "qrc:/images/tray-icon.png"

menu: Menu {
MenuItem {
text: qsTr("Quit")
onActivated: Qt.quit()
}
}
}

显示通知消息

SystemTrayIcon 也可以先用来显示通知消息。

下面的例子展示了如果用 showMessage() 来创建通知消息,和使用 messageClick() 信号来触发消息的点击事件。

1
2
3
4
5
6
7
SystemTrayIcon {
visible: true
iconSource: "qrc:/images/tray-icon.png"

onMessageClicked: console.log("Message clicked")
Component.onCompleted: showMessage("Message title", "Something important came up. Click this to know more.")
}
12
Uranus

Uranus

19 日志
1 分类
9 标签
© 2019 Uranus |
主题 — NexT.Muse
0%