我们总在抱怨传统的教育方式有问题、不适合现在这个时代了。不考虑教学内容方面的原因,单就测试这块就还停留在工业时代。一次很偶然的机会[1],我读到其实这块早在二十年前就有解决方案了,自己真是井底之蛙。
简单地说,考试这档子事,目前的问题在于反馈不准 & 反馈太慢:
- 反馈不准:一张卷子考了辣么多知识点,你丫就给我一个分数?我怎么知道哪些知识点掌握了,哪些还懵着?
- 反馈太慢:一个月,甚至一个学期才考一次。等到考的时候,都忘得差不多了。那难不成你要一天一考、一课一考?
这里主要解决「反馈不准」的问题,至于改进反馈的即时性,可以用游戏化的手法解决,暂时先放一放。
我们先来看一张成绩单:
学生 | 题1 | 题2 | 题3 | 题4 | 题5 | 做对题数 |
---|---|---|---|---|---|---|
丁一 | ✓ | ✓ | ✓ | ✓ | ✓ | 5 |
陈二 | ✗ | ✓ | ✓ | ✓ | ✓ | 4 |
张三 | ✗ | ✗ | ✓ | ✓ | ✓ | 3 |
李四 | ✗ | ✗ | ✗ | ✓ | ✓ | 2 |
王五 | ✗ | ✗ | ✗ | ✗ | ✓ | 1 |
赵六 | ✓ | ✗ | ✗ | ✗ | ✗ | 1 |
可以看到王五和赵六都只得了 1 分,你就能说他俩学得一样好了吗?赵六做出来的那道题,全班只有他和丁一做出来了,而王五做出来的那题,全班除了赵六都能做出来。每道题的难度是不一样的,这,是不是该区分一下啊?
学生 | 题1 | 题2 | 题3 | 题4 | 题5 | 做对题数 |
---|---|---|---|---|---|---|
丁一 | ✓ | ✓ | ✓ | ✓ | ✓ | 5 |
陈二 | ✗ | ✓ | ✓ | ✓ | ✓ | 4 |
张三 | ✗ | ✗ | ✓ | ✓ | ✓ | 3 |
李四 | ✗ | ✗ | ✗ | ✓ | ✓ | 2 |
王五 | ✗ | ✗ | ✗ | ✗ | ✓ | 1 |
赵六 | ✓ | ✗ | ✗ | ✗ | ✗ | 1 |
做错的人数 | 4 | 4 | 3 | 2 | 1 |
我们可以把「做错的人数」近似地看作「题目的难度」。其实如果要细究「难度的定义」,应该从「涉及的知识点」去考虑。这块后面还会回头来考虑。
现在我们用难度重新给每道题赋分:
学生 | 题1 | 题2 | 题3 | 题4 | 题5 | 得分 |
---|---|---|---|---|---|---|
丁一 | 4 | 4 | 3 | 2 | 1 | 14 |
陈二 | 0 | 4 | 3 | 2 | 1 | 10 |
张三 | 0 | 0 | 3 | 2 | 1 | 6 |
李四 | 0 | 0 | 0 | 2 | 1 | 3 |
王五 | 0 | 0 | 0 | 0 | 1 | 1 |
赵六 | 4 | 0 | 0 | 0 | 0 | 4 |
但这么算的话,李四该跳起来了「我做对了 2 道题,赵六才做对了 1 道,凭什么他的分比我还高?也许那一题是他蒙对的呢?」
有道理啊!但我怎么知道他是不是蒙的呢?李四又在旁边使坏水「你看赵六那人就不是能做出题 1 的人,他其他题一道都没做出来,肯定是蒙的!!!」
呃~~有点道理。那我们就用「总共做对了几道题」近似地去评估「一个人的总体实力」。实力越强,蒙的可能性越低;实力越弱,越可能是蒙的。
现在我们用「实力 - 难度」试试:
学生 | 题1 | 题2 | 题3 | 题4 | 题5 | 得分 |
---|---|---|---|---|---|---|
丁一 | 5 - 4 | 5 - 3 | 5 - 2 | 5 - 1 | 5 - 0 | 15 |
陈二 | 0 | 4 - 3 | 4 - 2 | 4 - 1 | 4 - 0 | 10 |
张三 | 0 | 0 | 3 - 2 | 3 - 1 | 3 - 0 | 6 |
李四 | 0 | 0 | 0 | 2 - 1 | 2 - 0 | 3 |
王五 | 0 | 0 | 0 | 0 | 1 - 0 | 1 |
赵六 | 1 - 4 | 0 | 0 | 0 | 0 | -3 |
我们可以看到,「实力 - 难度」这个指标不光是一个算分的中间值,它还是一个用来衡量「某人做出这道题的可能性大小」的工具。比如,哪怕让丁一去做题 1 ,也会很费劲 5 - 4 = 1
;但让他去做题 5 ,则很轻松 5 - 0 = 5
。
那如果这几道题,不是考题,而是知识点呢?我们能不能用这个工具去评估学生对各个知识点的掌握程度呢?我们只需要对它做一个 logistic 变换,就可以把它变成一个 0 到 1 之间的小数,我们能否用这个小数作为「某人做出某道题的概率」?
某人做出某道题的概率 = 1/ 1 + exp(-(实力 - 难度))
学生 | 知识点1 | 知识点2 | 知识点3 | 知识点4 | 知识点5 |
---|---|---|---|---|---|
丁一 | 0.73 | 0.88 | 0.95 | 0.98 | 0.99 |
陈二 | 0.50 | 0.73 | 0.88 | 0.95 | 0.98 |
张三 | 0.50 | 0.50 | 0.73 | 0.88 | 0.95 |
李四 | 0.50 | 0.50 | 0.50 | 0.73 | 0.88 |
王五 | 0.50 | 0.50 | 0.50 | 0.50 | 0.73 |
赵六 | 0.05 | 0.50 | 0.50 | 0.50 | 0.50 |
你会奇怪,为什么好些个没拿分的题显示的是 0.5 呢?其实,0.5 在 logistic 的语境中,就是「不确定」的意思。概率很大,接近于 1 ,就是「掌握了」;概率很小,接近于 0 ,就是「没掌握」。好吧,这是我瞎掰的。
如果丁一陈二张三李四王五赵六不是一个个学生,而是一道道题呢?如果这不是一张成绩单,而是一张「知识点涵盖矩阵」呢?
题号 | 知识点1 | 知识点2 | 知识点3 | 知识点4 | 知识点5 |
---|---|---|---|---|---|
一 | ✓ | ✓ | ✓ | ✓ | ✓ |
二 | ✗ | ✓ | ✓ | ✓ | ✓ |
三 | ✗ | ✗ | ✓ | ✓ | ✓ |
四 | ✗ | ✗ | ✗ | ✓ | ✓ |
五 | ✗ | ✗ | ✗ | ✗ | ✓ |
六 | ✓ | ✗ | ✗ | ✗ | ✗ |
题一涵盖了全部知识点,而题六只涵盖了知识点 1 。
那不就能用这种方式做到「评估知识点的掌握情况」了?需要注意的,实力那的值就不是这道题涵盖的知识点的个数了,而是学生做对某个知识点上的个数。
假设学生甲只做对了题四、题五:
题号 | 知识点1 | 知识点2 | 知识点3 | 知识点4 | 知识点5 | 做对与否 |
---|---|---|---|---|---|---|
一 | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ |
二 | ✗ | ✓ | ✓ | ✓ | ✓ | ✗ |
三 | ✗ | ✗ | ✓ | ✓ | ✓ | ✗ |
四 | ✗ | ✗ | ✗ | ✔ | ✔ | ✓ |
五 | ✗ | ✗ | ✗ | ✗ | ✔ | ✓ |
六 | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
做对该知识点的数目 | 0 | 0 | 0 | 1 | 2 | |
知识点的难度 | 4 | 4 | 3 | 2 | 1 |
知识点 | 知识点1 | 知识点2 | 知识点3 | 知识点4 | 知识点5 |
---|---|---|---|---|---|
掌握程度 | 1 / (1 + exp(-(0 - 4))) |
1 / (1 + exp(-(0 - 4))) |
1 / (1 + exp(-(0 - 3))) |
1 / (1 + exp(-(1 - 2))) |
1 / (1 + exp(-(2 - 1))) |
值 | 2% | 2% | 5% | 27% | 73% |
可以看到,甲对知识点 5 掌握得最好。
简单来说,思路其实相当相当简单:
- 做对该知识点越多,掌握得越好;
- 该知识点在整套题中出现得越罕见,难度越大,越不容易掌握;
但上面这套算法没有解决一个很关键的问题:知识点之间是存在依赖关系的。比如:要想掌握分数的通分,至少得先学会整数的加减、求公分母……吧。但以上算法并没有考虑这个。
解决的思路其实也很简单:挨个考察这个知识点「所有的先修知识点」的掌握情况。
首先,我们得先细致地考察一番知识点的内在结构。我们用一个矩阵来做这事。其实这完全是为了数学上处理方便,用 if-else 同样解决问题。
但我们正在想要的是,能够回答「节点 i 是不是节点 j 的先修知识点,直接或者间接都行」的矩阵。其实我们只要对上面这个矩阵加上一个单位矩阵,再反复自相乘直到收敛就行了。注意是布尔相乘哦。
现在,你问「知识点 2 是不是知识点 5 的先修知识点?」,只要查第 2 行第 5 列是否为 1 就行了。我们先给个记号:q(5 → 2) = 1
。「q」就是 required 的意思啦。
好,搞定第一个工具。
下面要讲的,数学形式可能和上面那个「实力 - 难度」公式不同,但本质是一个意思。
下面我们构造一个矩阵,如果甲同学在题 i 中掌握了知识点 j 所需的所有知识点,记作 1;反之,为 0 :
题号 | 知识点1 | 知识点2 | 知识点3 | 知识点4 | 知识点5 | 做对与否 |
---|---|---|---|---|---|---|
一 | 0 | 0 | 0 | 0 | 0 | ✗ |
二 | 0 | 0 | 0 | 0 | 0 | ✗ |
三 | 0 | 0 | 0 | 0 | 0 | ✗ |
四 | 0 | 0 | 0 | 1 | 1 | ✓ |
五 | 0 | 0 | 0 | 0 | 1 | ✓ |
六 | 0 | 0 | 0 | 0 | 0 | ✗ |
(待续……)
下面上公式?
-
本来是在备考政治,然后社情民情这块有几个数据,就手贱去查了下。结果发现政府其实发布了很多数据。然后就想玩玩这些数据弄出个「房价预测模型」来。然后考虑学区房的影响时,又发现有教育领域的数据,就想弄个「教育质量评估模型」来。再然后对教育测试产生了兴趣,偶然发现了这篇《认知诊断?基于一个案例的理解(改进版)》。然后……就入坑了。 ↩