作者lucien0410 (lucein)
看板DataScience
标题Re: [问题] Validation set 到底在做什麽?
时间Fri Mar 30 10:14:39 2018
ot大的建议让我弄懂了neural net训练时
为什麽都要附上一组validation set
(如果我又错了 再请g大帮我validate一下!)
是的 我们就假设 如果没有validation set会发生什麽事
另外我们再来假设 我们有无穷无尽的时间或是运算资源
没有validation set 我们可以训练neural net吗?
答案是可以的 YES!
训练到底需要什麽:
(1) 训练资料
(2)预先设好的超参数 (e.g. layer size, layer type, mini batch size 等等;
特别注意 我没有设定epoch size; 或者我们把epoch size设为无限大(反正我们有无限
的时间和运算资源);
(1)(2) 弄好就可以开始epoch by epoch 的训练了;
每次搞定一个epoch 我们就会得到一个模组
我们让它训练到天荒地老; 产生无数个模组;
用数学集合的方式来表示的话,我们就会得到下面的集合.
trained_models=
{<epoch_i, train_preplexity_i, train_accuracy_i, Same_HyperParameter> |for i
in N }
这个时候问题就来了!!!
trained_models 是一个无限大的集合 我们想要从中挑一个最好成员 那该怎麽挑呢?
这些成员的超参数都一样 所以超参数不能用来作为挑选的依据
那有哪些特徵是可能有用的呢?
train_preplexity, train_accuracy 可能有用 但很可能不准 因为我们会有overfitting
的问题; epoch number也不能用, 因为也不一定高的epoch越好, 一样是overfitting的问
题.
每个epoch的模组都一模一样!!!
这样就像唐伯虎点秋香 每个都戴上面具 那个才是我们的秋香呢?
随便选一个 大家拼人品吗? 挑到石榴姊怎麽办?
唐伯虎就大喊了 "别人笑我太疯癫 我笑他人看不川 ..."
看谁抖了一下
我们可以用类似的方式
预先准备好一个validation set,每个epoch训练好,就要它预测validation set看看
现在加进了validation set, 我们的模组集合就会变成这样
{<epoch_i, train_preplexity_i, train_accuracy_i, validation_preplexity_i,
validation_accuracy_i, Same_HyperParameter> |for i in N }
现在我们就可以从validation preplexity 和 accuracy 来判断要挑那个好.
注意这里,我们依然*不是*挑超参数,因为这组模组集合的成员的超参数还是依然一模一样
现在我的理解就变成跟着一起训练的validation set的作用就是用来挑ephoch number了
还有 这里的validation 跟 cross validation 没有关联; 因为我们没有*cross*
用的一直是同一份的validation dataset
这个就仅仅算是*hold-out validation*
以上是算是澄清事实吧
要是讲错了 再麻烦大家指点!
######################################
以下我再来提问 两个问题
(a)用偷偷把validation set塞回去 这样好吗? 会有什麽问题?
如果这个validation set就是拿来挑 那个ephoch好,
那我们现在可以作弊一下
我们先使用validation set 找到最佳的ephoch number
记住这个黄金数字
现在把validation set放到training set 两个合在一起
(这样我们就有更多样本了)
再把这个新的较大的training set再重新一次
反正我们已经*预先*知道那个epoch最好了
用偷偷把validation set塞回去 这样好吗? 会有什麽问题?
实作上 这是惯用手法吗?
(b)用了validation set 就*一定*能挑到最好的了吗?
我认为觉得不是 这跟我们的validation set挑的好不好非常有关
要是人品不好 正好挑到不具代表性的样本来做validation
那我们的validation preplexity 和 accuracy 也就不可靠了
(以後我要骂人都要骂 "祝你的validation set都挑到坏样本!"
推文就说 "希望你的validation set挑的特别好!")
这个也呼应了pipidog大前文说的 validation set 怎麽挑是个大学问
validation成绩最好 应该也不是一定最好的模组吧
要避免挑到极端样本的机会 还是得来弄一下n-fold cross-validation
但是弄了n folds 之後训练时间就增加了n倍
除了增加时间成本外 这样的作法可能会有什麽问题呢?
实作上 这是惯用手法吗?
※ 引述《outrunner (ot)》之铭言:
: ※ 引述《lucien0410 (lucein)》之铭言:
: : 可是可是我的问题没有回答到 (是我一开始没问对问题)
: 不如你来回答问题, 你怎麽知道模型要训练到什麽时候(epoch size)?
: : 换个方式讲
: : 假设我有两份已知资料(AB两份资料)
: : A拿来训练
: : B拿来测试
: : B的测试结果告诉我们成果到底怎样 公平的验证
: : B就是终极测试
: 这样做当然很好, 但代价也很昂贵.
: 回到上面的问题, 你需要验证多少次? 每个epoch验证一次?
: 更别提很多时候是没办法这样做的.
: (ex. B没有答案. 有的话我会拿来做训练)
: : 但其实训练A之前 可以调整很多hyperparameter
: : 所以就先把A切成 a b
: : 拿a 训练 b 测试 找寻最佳的hyperparameter
: : 找到後 再依这样的设定训练A (期待B的测试会最好)
: : 但是OpenNMT要求在训练小写a时也必须提供val set
: : 这就是我的问题了
: 他就是边训练边测试啊, 不然你怎麽知道训练得如何了?
: 其实就是把你想手动做的事情自动化啦.
: 如果你有看他的说明书:
: Validation files are required and used to evaluate
: the convergence of the training.
: It usually contains no more than 5000 sentences.
: 第一句就是前面讲的.
: 第二句的意思是做这个很浪费时间. (别误会, 是学问很大的意思)
: 然後"找寻最佳的hyperparameter"也不是很重要,
: 想太多不如先train下去, train久了就有fu了.
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 68.230.60.98
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/DataScience/M.1522376082.A.FDF.html
※ 编辑: lucien0410 (68.230.60.98), 03/30/2018 10:28:42
1F:→ EGsux: 你都要做seq2seq了 你要不要认真查一下书看一次这些ML DL 03/30 12:08
2F:→ EGsux: 基本阿 03/30 12:08
3F:推 yoyololicon: 原po感觉很兴奋XD 03/30 12:46
4F:推 goldflower: 1. 假设你validation set找到epoch数 没道理他就不能 03/30 16:51
5F:→ goldflower: 拿来挑其他超参数 03/30 16:51
6F:→ goldflower: 2. 你挑完超参数後你就能期待你已经找到很不错的model 03/30 16:52
7F:→ goldflower: 所以放进去当然是可以 除非你validation分布特别怪 03/30 16:52
8F:→ goldflower: 但validation分布特别怪的话你的training应该就GG惹 03/30 16:53
9F:→ goldflower: 3. 当然不一定R 你今天上班路线每天都会捡到一百块 03/30 16:56
10F:→ goldflower: 所以你都挑那个时间出门 但是还是可能被别人捡走R 03/30 16:57
11F:→ goldflower: 4. 我很废所以不要cue我 QQ 03/30 16:57
12F:推 galapous: 塞回去不就本末倒置,validation set 就是用来避免 03/31 12:56
13F:→ galapous: overfitting,你塞回去 train 你怎麽知道你 train 多久 03/31 12:56
14F:→ galapous: 不会 overfitting 03/31 12:57
15F:推 goldflower: 楼上可以参考下田神机器学习基石validation那部分 03/31 17:15
16F:→ goldflower: 比较直觉的想法就是当你选择好超参数後 如果你认为 03/31 17:20
17F:→ goldflower: 加入validation会导致overfitting 也就是你相信 03/31 17:20
18F:→ goldflower: validation在母体当中偏向杂讯 那麽也就代表你整个 03/31 17:21
19F:→ goldflower: training过程完全是不可信的 03/31 17:21
20F:→ goldflower: 那麽你当初选出来的超参数就是不可信任的 03/31 17:23
21F:推 goldflower: 上述笔误 training过程改成validation才对 03/31 17:26
22F:推 goldflower: 呃 我说比较直觉是对我比较直觉 不知道其他人如何XD 03/31 17:36
23F:→ ACMANIAC: 回楼上,假设你 train 10 epoch 收敛,超过就 overfit- 04/01 11:54
24F:→ ACMANIAC: 那你怎知道 train + val 几个 epoch 不会 overfitting? 04/01 11:55
25F:→ ACMANIAC: 还是直接设定 10 ? 训练样本不同,收敛情形会相同吗? 04/01 11:57
26F:推 goldflower: 你都知道10个了 那就只训练10不就好了 04/01 12:57
27F:→ goldflower: 资料越多越难overfitting 04/01 12:58
28F:→ goldflower: 而你在validation的时候你已经找出一组超参数使得他 04/01 12:59
29F:→ goldflower: 在validation上也运作的不错 所以收敛情形也不会差太 04/01 12:59
30F:→ goldflower: 多 如果收敛情形差很多 那你当初根本没有选择到这组 04/01 12:59
31F:→ goldflower: 超参数的机会 04/01 12:59
32F:→ lucien0410: g大果然懂很多 04/01 13:38
33F:→ lucien0410: g大我的理解是如果train在epoch k收敛, train+val应 04/03 01:18
34F:→ lucien0410: 该会在epoch k的时候收敛. 这样对吗? 04/03 01:18
35F:推 goldflower: 我们只能"希望"如此 经验上可能不会差太多 04/03 12:48
36F:→ lucien0410: 这可以是一个实证问题吧 paired t-test 可以搞定 04/03 13:22
37F:→ lucien0410: 一组train 一组train加val 04/03 13:24
38F:推 goldflower: 虽然我没看过这样做的 不过或许可以吧 拿training 04/03 15:37
39F:→ goldflower: error差何时显着这样看? 04/03 15:37
40F:→ lucien0410: 手机推文吃掉我的符号了 04/03 16:35
41F:→ lucien0410: 如果train在epoch k收敛, train+val应该会在 04/03 16:37
42F:→ lucien0410: 在epoch >= k的时候收敛. 这样对吗? 04/03 16:38
43F:推 goldflower: 直觉上来说是这样 数学上的证明要交给高手了@@ 04/03 23:20
44F:→ goldflower: 如果小於就收敛的话就代表validation的部分在w的超空 04/03 23:20
45F:→ goldflower: 间中提供了更好的梯度方向 那就回到上面 我们可能 04/03 23:21
46F:→ goldflower: 挑不到这组美妙的超参数 04/03 23:21
47F:推 goldflower: 恩...似乎也不一定挑不到 小於就收敛我目前想不到 04/03 23:26
48F:→ goldflower: 太好的解释 04/03 23:26
49F:→ lucien0410: g大真的是高手 04/04 00:49