|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?免费注册
x
最近统计机器学习的课快结束了,正好做一下小小的总结。$ \& I% N% f# O" ^( i$ I( E* L(欢迎访问老王论坛:laowang.vip)
( R* {( q3 R: B3 S6 a3 {$ ?(欢迎访问老王论坛:laowang.vip)
Requirements: 高中概率和一点点本科的概率论,和一些统计机器学习的基础知识。
. Q& m- P# [2 P2 [! k5 L" }) C% a9 u1 |. ?2 ]: }(欢迎访问老王论坛:laowang.vip)
00:5 o4 @7 @$ U) y) ?0 X(欢迎访问老王论坛:laowang.vip)
2 J0 g/ V" @' }3 t(欢迎访问老王论坛:laowang.vip)
最近(其实已经不是最近了)感觉机器学习领域最热门的是两个话题:ChatGPT类型的transformer模型,和Stable Diffusion这类生成式模型。不难注意到,这两类模型在解决两种完全不同的问题:对于一个sequence(序列,很多情况下就是你的输入,以及历史的上下文)他的后续应该是什么,以及给定一组D(一堆数据)找到他在某个空间的分布。对于前者,当你知道每一段输入的下一个词语是什么的时候,你就可以生成文本,而对于后者,除了D是数据,在哪个空间,什么分布,似乎都不是非常明了(当然,你也可能早就了解到这些信息了)。
: k9 X. d/ {0 y- ^7 `# l" _# J4 s5 b7 g(欢迎访问老王论坛:laowang.vip)
遵顼传统地,先给出两个重要量的定义:
9 x9 H; t+ j0 B RD={x_1, x_2, ……, x_n} 是数据集,其中包含n个元素。以图像生成为例,这些元素就是图片。' r! p1 `' Y7 O9 P! e(欢迎访问老王论坛:laowang.vip)
θ={z_1, z_2, ……, z_m} 是隐变量。这是一些我们不知道的变量,但我们希望通过算法学习到这些变量,并且用这些变量重构D。
# p* z/ M0 K- @+ x9 F5 Q0 s7 G
{. T( J% y v( e* b& [其实看不懂也没关系,因为我课上到这里的时候也不清楚这两个量的意义。, G" v( _& Z$ M) [4 N& Q( i3 ?0 e- @(欢迎访问老王论坛:laowang.vip)
]0 o0 Z9 `2 N让我们从最简单也是最符合直觉的GAN开始吧。
8 ^. g1 F4 I+ `) e
) K! A) Q1 X* e; L01:- z- H% x9 m) I. k, V6 K0 l# [) C(欢迎访问老王论坛:laowang.vip)
3 `8 `& r9 q% L& b+ C9 \(欢迎访问老王论坛:laowang.vip)
GAN可以用来生成图片,其训练的原理也众所周知:模型分为生成器和鉴别器,生成器负责生成随机的图片,鉴别器负责判断一张图片来自生成器还是来自数据集D。这是一个非常简单而符合直觉的模型:如果模型训练良好,那么生成器就会生成尽可能像原始数据集的图片从而骗过鉴别器,鉴别器在一次次的欺骗中也学会怎么从最微小的差别中判断到底图片来自哪里,那么随着时间的进行,鉴别器愈发精明的同时生成器生成的图片也更能让人信以为真。$ ~* R9 v+ q7 [" m! [% C(欢迎访问老王论坛:laowang.vip)
( ]7 F; p% D& _, m(欢迎访问老王论坛:laowang.vip)
那么随之而来的是三个问题。3 h5 F9 s V& S0 _; j6 l" f(欢迎访问老王论坛:laowang.vip)
模型怎么训练?9 z- ]+ ^9 w: E) K A% c(欢迎访问老王论坛:laowang.vip)
鉴别器怎么鉴别?
- h% N, H' K! k) k# \) w 生成器怎么生成?2 \ U' E" c4 h+ p' s8 O, C1 m(欢迎访问老王论坛:laowang.vip)
1 x: P% b, a6 D对于第一个问题有疑惑的人,其实答案是很简单的梯度下降。你只要定义好loss,而pytorch要考虑的就多了(((。只要知道一个loss是可微的那么模型就是可梯度下降的。关于这个如果你不知道什么是梯度下降那么可能去百度一下有无数人比我更能讲清楚。其实基本所有的模型都是这么训练的。% `- f9 s' m+ ]& h1 N+ |( R(欢迎访问老王论坛:laowang.vip)
' E/ S8 w/ r s: Y6 a(欢迎访问老王论坛:laowang.vip)
对于第二个问题,答案是这就是一个简单的图片分类问题,而且还是其中最简单的二分类,任何一个Data Science和ML专业的学生都不会对此感到陌生。, s& }0 y- X; C8 ?, d(欢迎访问老王论坛:laowang.vip)
第三个问题的答案是,从一个随机的输入开始,经过一个网络就生成了。这个网络在最简单的情况下可以是一个多层感知机(一堆全连接层),或者有卷积,逆向卷积这些CV里常用的网络结构。那么这个模型的输入是什么呢?是一个随机的噪声,更确切的,他是一个高斯噪声。
0 s$ i8 F- d" G' B4 P( a& d0 @1 ^) \: Y* o8 b5 O6 v0 D2 h* w# C" y(欢迎访问老王论坛:laowang.vip)
也就是说,这个模型包含两个网络:一个通过随机的噪声生成了图片,一个判断图片的来源。而令人感到惊喜的是,这个随机噪声就是θ。在GAN中,θ并没有被学习到,被学习到的是两个网络。: Z2 u! V; J: @# Y( u$ m% n6 R3 E(欢迎访问老王论坛:laowang.vip)
e; c' e: I; B1 E& z6 ?(欢迎访问老王论坛:laowang.vip)
至此,θ和D就都被提及了,希望能让大家有个概念。
' Y/ E( \# F! p% V
* ]* v/ }' Y6 S* `02:% ?. e. a$ p& g" A0 E0 c( \(欢迎访问老王论坛:laowang.vip)
]% m4 Z' o, t' V( q在编码器-解码器的架构中,VAE是其中之一。编解码器的架构的意思是,模型有编码器和解码器两个部分(呃……)。编码器把D编码成θ,而解码器从θ中恢复出一个D’。而模型的loss就是D’和D的区别,以及一个kl散度(这个先不必理会)。1 B! _0 K) q" Z/ ?' Q. B) |(欢迎访问老王论坛:laowang.vip)
2 Y+ m8 e. j' x- M! z$ _一般来说,模型训练完美之后,从一个x∈D经过编码器产生一个θ,用这个θ经过解码器会得到和x完全一样的图像。
9 _( z8 o5 T) A# t: J" v J1 P% L! r/ i
$ @& c5 C+ l3 |7 A; |这是我们希望的吗?1 \& j! @4 u+ i) S2 I; S. r8 j(欢迎访问老王论坛:laowang.vip)
, Q* [ e& o4 g! F其实并不是,我们希望的是获得一些稍微不同的图像。比如我输入的是一张JK的色图,得到了一个隐变量θ,我希望得到的是其他的图片,最好也是色图,最好也是JK题材,而不是获得一个打了马赛克的原图(因为θ一般比输入要小,所以信息多少会丢失一些,因此恢复的图像的质量会变差)。怎么做呢?答案是在θ附近采样。一个符合直觉的猜测是:如果一个θ对应解码后是JK色图,那么他的附近生成的也应该是JK色图。, {9 ~4 _0 o! ](欢迎访问老王论坛:laowang.vip)
2 }+ @& r# a2 S! f事实并非如此,要不然也不需要大费周章地搞VAE了。* k- m; Y& i9 m0 X; {3 R# T/ v(欢迎访问老王论坛:laowang.vip)
; G# x, H4 e! J1 a其实根本原因在于θ所在的空间性质很差。从你当前的位置向某些方向移动或许是JK色图,向另一些方向移动一点点就变成章鱼色图,再朝另外一个方向移动就会变成JK鬼片。在三维的世界里我们有三个正交的方向,然而θ常常有几千的维度,也就是几千个正交的方向。如果不要求每个方向向量完全正交,那么几千的维度可能会产生上万个方向。(这段推导或者模拟都很麻烦)。总之就是,这个空间的性质很差,以至于你没有办法知道你应该去哪里采样。$ C6 G" a( p8 H& b* ~3 ^(欢迎访问老王论坛:laowang.vip)
% Y1 L/ @6 l; K; y所以我们需要VAE。* k9 P! n/ k$ s$ ~(欢迎访问老王论坛:laowang.vip)
' V; Q, N$ q6 S% ?(欢迎访问老王论坛:laowang.vip)
VAE的一个基本假设是θ应该满足高斯分布。高斯分布是一个性质很好的分布:首先他很圆,所以一个点附近的点和他也是近似的。其次是有些东西是可以计算的,过会就能看见。
2 s7 B2 ^/ a" s' ?2 _; p) _
/ z; {) U& F9 t5 T7 Y- c0 N& C在VAE的视角下,问题变成了:/ ?# X8 n, \+ V$ b; {(欢迎访问老王论坛:laowang.vip)
我们有:
. H( X. |( J: p, i3 `2 w- \数据的分布:p(D) 我们不知道
& P8 a) @: ]+ p5 x, l; gθ的分布: p(θ) ~N(0, 1) 我们假设他是一个标准正态分布。
" N0 K3 Q$ |8 F现在我们希望将D编码到θ,并且从θ恢复到D。
9 K* z, x9 Q( np(D| θ)是似然,就是从θ还原成D的概率. f4 `& V! R# O, ?& B1 ~(欢迎访问老王论坛:laowang.vip)
p(θ|D)是后验,既从D编码成θ的概率。(其实这里一般是说在观察到数据D后对θ分布的猜测)
. D' b) g1 O4 f% j+ X" _4 ?3 f: @( p9 i(欢迎访问老王论坛:laowang.vip)
那么loss的设计就很简单了。我们希望θ能准确的还原D,所以只需要最大化似然就行。: J2 H- M/ I) m3 K/ ~9 [(欢迎访问老王论坛:laowang.vip)
但是这一切怎么计算呢?我们对于似然和后验都不知道,所以我们需要一个好的后验的假设,让似然是可以计算的。我们这门课叫这个东西conjugate priors,& L: W( i) [; t% T0 _1 ?! c6 `(欢迎访问老王论坛:laowang.vip)
% G6 S6 s: Y# t6 s) V(欢迎访问老王论坛:laowang.vip)
https://en.wikipedia.org/wiki/Conjugate_prior 这里有更多的例子。; ?1 D1 w- ?! X% W+ P1 i1 p2 [/ P8 }(欢迎访问老王论坛:laowang.vip)
0 M" Z2 ~% l8 B, O(欢迎访问老王论坛:laowang.vip)
话说回来,既然我们假设了先验,也就是p(θ)是一个正态,那么如果我们假设似然也是高斯,那么后验就可以计算了!
V4 L3 J2 U; O6 ~( v. A9 O( x( B2 {8 f/ }6 N; U% E(欢迎访问老王论坛:laowang.vip)
VAE干的事情就是假设似然也服从一个正态分布,均值和方差就是可以学习的参数。" j- D* h6 J G) b6 X. E(欢迎访问老王论坛:laowang.vip)
) g$ [2 K& E) W7 C/ X0 v y" B* a9 G6 V结局就是VAE在一个x给出的θ旁的采样也是和x类似的!
) P( k4 a+ K) q& f; @& v" W* N) m' @5 x/ g0 h. E(欢迎访问老王论坛:laowang.vip)
那么古尔丹,代价是什么呢?答案是首先,你做出了两个假设。第一个先验的假设还算合理,第二个就完全是为了凑共轭而嗯造出来的,事实上似然几乎不可能是一个高斯,我们只能用一个高斯去近似(这也就是kl散度那一项,目的是让这个高斯尽可能接近真实的似然)。但只有两个参数的高斯何德何能能逼近一个一般需要上万参数才能拟合的分布呢?所以这导致的结果就是:VAE生成的图片很烂。但他保证了你能找到类似的图片。5 u7 Q5 } K1 d: a. p6 s$ x(欢迎访问老王论坛:laowang.vip)
u; c! [4 e- f2 B(欢迎访问老王论坛:laowang.vip)
03:diffusion3 N, H. A/ d+ J% z6 ?(欢迎访问老王论坛:laowang.vip)
既然一层的VAE是不好用的,那么不如试试叠一堆VAE到一起。你既可以把diffusion理解为一堆VAE,也可以从他的形式上理解为他就是在原图上一点点加高斯噪音,直到图像完全变成噪音后,再从噪音一点点重建图像。效果很好。效果好的一方面是因为网络变深了,因此参数是VAE的几百上千倍,自然能学到更加精细的结构。第二点我觉得是因为一堆高斯的叠加才能拟合复杂的分布,就好像一堆线形层的堆叠才能识别复杂的结构一样。
) l, ~2 y3 F" ?' x7 z
$ u+ y! ~8 N4 Q7 ?, q1 R |04:不是,我写不下去了。直接快进到结语部分。* F1 q; ^, m! e! ]. v& r4 C(欢迎访问老王论坛:laowang.vip)
# r5 Y: b% f1 o/ p6 _(欢迎访问老王论坛:laowang.vip)
其实这件事情远比这一点点东西复杂,但怎么能不牵扯到麻烦的概率论和很多机器学习的概念又能讲明白确实不是很容易做到,真这么写了有时候又觉得写得很像是你去知乎也能看到的科普,以及更重要的是我不知道这个论坛怎么写latex,导致写公式异常难受。( Q) }% P% Q8 @' ~$ A+ S( t(欢迎访问老王论坛:laowang.vip)
/ e0 g+ F( G: n$ i7 M但如果你知道loss是什么,知道什么是正态分布,最好也知道先验,后验和似然,更巧的是这么博学的你竟然不知道VAE,那么可能你会对VAE有个大致的概念。5 O i( Z' Y5 L6 o( `1 W(欢迎访问老王论坛:laowang.vip)
4 u9 O# s6 A9 q. ^% d2 n, J
0 C7 g9 C# w0 b$ U! N( e7 R顺便调研一下真的有人看吗?以及看的人的分布是什么样的,还有有什么计算机相关的问题。主要思索了好久也不知道什么主题好,我会的大家都会,专业的知识网上也有很多现成的。- e% y- S& V! B2 B( @(欢迎访问老王论坛:laowang.vip)
要不然下一篇讲讲怎么从逻辑门到简单CPU吧,计组和数电我学的还不算太差的。或者有什么关于C++(20以前)或者机器学习的推荐主题?我发现我一旦写下我学过的东西或者给别人讲之后我的印象就会更加深刻,所以可能等着课少一点的时候会再更新一些。
7 \ n' ?) m& z) P0 F( ~% h) W9 N; ~4 H, `1 ?9 g(欢迎访问老王论坛:laowang.vip)
看了看感觉好像逻辑性和其他芝士帖子没法比,,,有点惭愧4 t+ ]3 ~* k5 t& f$ b2 Y0 u(欢迎访问老王论坛:laowang.vip)
3 j# Y6 E8 k3 x
3 @+ ^6 w& U+ w% H9 H9 z |
评分
-
查看全部评分
|