反直觉!一种新方法或让AI模型拥有“联想”力,甚至能识别从未见过的事物
一种新的方法正在让人工智能模型获得人类的 “联想” 能力,甚至能让它识别此前从未见过的事物。
来自加拿大滑铁卢大学的博士生伊利亚(Ilia Sucholutsky)和他的博士导师马赛厄斯・尚劳(Matthias Schonlau)教授,首次提出了 “少于一次” 样本学习的概念和方法,并由此为人工智能技术的演进提供了新的思路。
相关研究论文于 2020 年 9 月发表在预印本网站 arXiv 上,名为 “'Less Than One'-Shot Learning: Learning N Classes From M < N Samples”。
伊利亚告诉 DeepTech,他们的研究显示,对于机器学习模型来说,理论上通过两个样本(example)即可训练模型学会识别任意数量类别(class)。
没人知道,这种方法一旦实现大规模应用,人工智能会迸发出怎样的火花。
高企的训练成本
机器学习,尤其是深度学习往往需要大量的训练数据。
著名的语言模型 GPT-3 使用了 45TB 的数据进行训练,这个过程耗资达到了惊人的 1200 万美元,即使有微软的鼎力相助,训练结束之后发现了一些小 Bug 也不舍得重新训练。
目前,GPT-3 是炼丹师们 “大力出奇迹” 的集大成者,但可以预见,不远的将来一定会有新的模型超越并取代它的位置。
“更多更大更强” 的思路是没有尽头的。假如我们稍稍停下疲于奔命的脚步,回归到现实中的人类学习过程,就会发现一个触及灵魂的拷问 ——人工智能真的必须依托如此巨量的数据才能够实现吗?
相信很多人的答案并不笃定。
举个例子,假如现在需要让人工智能模型 “认识” 马这种动物。常规的做法是挑选成百上千的马匹图像对其进行训练。
之所以需要如此之多的样本,是因为同样一匹马,仅仅是转换一个拍摄角度,或微调一些肉眼无法观察的像素点,人工智能就会识别失败,所以需要大量的大小、颜色、体态、朝向、品种不一的样本填满人工智能的 “盲区”。
即便如此,人工智能的识别成功概率也不能达到 100%,我们离创造真正可以复现大脑理解能力的人工智能还非常遥远。
但人类的儿童,却只需要一张看图识字的卡片,便能轻易分辨出唐僧所骑乘的是马,而不是其他外型类似的生物。并且,儿童一旦学会识别某种事物,这项技能终其一生都很难忘记,只会越来越熟练。
更有甚者,儿童可以在没有任何真实示例的情况下 “认出” 一个新的物体。例如,展示给他们一匹马和一头犀牛的图片,并告诉他们独角兽结合了两者的特点,他们就可以在第一次看到独角兽时认出这个传说中的生物。
伊利亚和导师认为,人工智能模型也应该具备同样的能力。也就是说,人工智能模型应该可以从 M 个样本中学习到 N 个类别,其中 N 可以远远大于 M。这样,理论上模型就可以识别比训练示例更多的图像,而此前的科研人员可能并未充分挖掘训练数据的全部潜力。
他们将这一过程称为 “少于一个” 样本学习(LO-Shot Learning)。
考虑到居高不下的训练成本和日益庞大到接近极限的训练数据,这种让人工智能学会 “合理联想” 的方法或许会在未来产生颠覆性影响。
如何实现 “少于一个” 样本学习?
在此前的一篇论文中,现为麻省理工学院博士生的 Tongzhou Wang 和同事介绍了一种 “蒸馏” 方法,可以将大数据集 “提纯” 为小数据集。
作为实践,他们将 MNIST(一个包含了 6 万张从 0 到 9 手写数字图片的业内常用测试数据集)提纯压缩成了一个仅由 10 张图像组成的训练数据集。
这些图像不是直接从原始数据集中选取的,而是经由一系列的设计和优化后,赋予了这 10 张图像几乎与整个原始数据集相同的信息。
因此,仅仅用这个超精简数据集对人工智能模型进行训练,就可以达到与用 MNIST 所有图像进行训练的模型几乎一致的识别精度。
伊利亚和导师从中受到启发,并且认为可以在 Tongzhou Wang 的方法上更进一步 —— 既然可以将 6 万张图像压缩到 10 张,那么为什么不能将它们压缩到 5 张或更少呢?一旦实现,就意味着,通过区区几张图象的训练,人工智能模型就能掌握从 0 到 9 这 10 个数字的各种手写数字图片,从而实现前面所说的 N 大于 M。
伊利亚很快发现,想要达到这个效果的诀窍就是创建混合有多个数字特征的图像,然后为它们打上 “软标签(让一个数据点同时成为多个类别成员的矢量表示)”,再来用这些样本训练人工智能模型(类似于前文的马 + 犀牛混合体)。
“你可以想象一下数字 3,它看起来有点像 8,但一点都不像 7。” 伊利亚说。
“软标签的目的在于标注这些共同的特征,进而以这种方式增加信息密度和维度。因此,相比于直接告诉模型这个图像是 3,我们会说,这个图像有 60% 可能是 3,30% 可能是 8,10% 可能是 0。” 使用这种数据训练出的模型,基本可以达到与常规训练方式一样的精度。
“少于一个” 样本学习的局限性
当伊利亚和导师成功地使用软标签在 MNIST 上实现 “少于一个” 样本学习后,他们开始思考这个方法能否用于更广阔的领域。人工智能模型从小样本中可以识别出的类别数量是否存在上限?
答案是否定的。
从理论上来看,使用精心设计的软标签,甚至只用两个示例就可以承载任意数量的类别信息。伊利亚说:“通过两个数据点,你就可以分离出一千个,一万个,甚至是一百万个类别。”
伊利亚和导师通过纯数学方式的推导,在论文中证明了这一点。他们使用一种最简单的机器学习算法 ——K-近邻算法(kNN)来表述这一概念,该算法使用图形方法来为对象分类。值得注意的是,他们在 kNN 算法的基础上进行了开发,并将最终的算法称为 SLaPkNN(soft-label prototype kNearest Neighbors)。
在进一步说明之前,有必要以水果分类任务为例,简单说明 kNN 算法的核心逻辑。
假设我们要训练 kNN 模型识别苹果和橙子,你必须先确定每个水果的特征,这里以颜色(X 轴)、重量(Y 轴)为例。这样你就可以将多个苹果和橙子的信息输入 kNN 模型。
kNN 算法会将所有数据点绘制在一张二维图表上,并在苹果和橙子分布点的中间地带绘制边界线。
为了将 kNN 算法应用于 “少于一个” 样本学习,伊利亚和导师创建了一系列微型的合成数据集,并精心设计了它们的软标签。
然后,他们让 kNN 算法绘制了它从样本中看到的边界线,发现它成功地将样本分成了比数据点更多的类别。
通过对类别边界线的复杂编码和样本软标签的调整,他们让 kNN 算法精确画出不同形状的花朵图案。
当然,凡事总有两面,这个方法也有其局限性。
当伊利亚和导师尝试将 “少于一次” 样本学习的方法应用到其他更复杂的算法(如深度学习等)时,他们发现设计软标签的工作变得异常困难。
kNN 算法具有很好的可解释性和可视性,为人们设计标签提供了良好基础。但神经网络是复杂且不可穿透的,这意味着同样的方法未必可行。并且,设计用于 “凝练” 神经网络训练数据的软标签时也有一个主要难点:设计者需要面对庞大的数据集并凝练出有效的内容。
这一工作目前看来不可能全部通过人工完成。伊利亚说,他现在正在研究其他方法来设计这些凝练后的合成数据集 —— 无论是手动设计还是使用其他算法进行设计。
尽管存在诸多挑战,但不可否认这篇论文为 “少于一次” 样本学习提供了理论基础。“无疑经过凝练的数据集将带来极大的效率提升。” 伊利亚说。
图 | 伊利亚(Ilia Sucholutsky)
需要从图像或视频帧中识别成千上万个类别的计算机视觉系统(如自动驾驶)、执行情感分析的自然语言处理系统等都将从中受益。
Tongzhou Wang 对此补充道,这篇论文同时也提出了一个非常新颖且重要的目标 ——如何从小数据集中训练强大的模型。
从人类的学习经验来看,这是能够实现的,应用领域也异常宽广。从抓捕只有一张照片的犯罪嫌疑人,到识别海上航行的敌方舰艇,都是典型的小样本场景。
对于这项成果,也有业内人士指出 “可能很难实现”。一名杜克大学的计算机科学博士生告诉 DeepTech:“用很少的样本去生成很多的类,是一件非常反直觉的事情。虽然他做到了这一点,但后续依然需要将各种特征组合成现实中的真实事物。”
该博士生分析称,如果把人类的眉、目、鼻、口、耳这五官特征提取出来,然后通过伊利亚的方式整合到一起,可能可以组成世界上所有存在、不存在的人脸,但在训练模型的时候,依旧需要让机器知道真正的人脸是怎样的。
也就是说,模型通过伊利亚的方法训练之后,还需要再增加一个新的步骤来实现闭环,这个新的学习步骤如何实现,以及实现的难易程度,才是关键所在。并且,五官的特征也是需要从大量的、有标签的数据中来的。但他也承认,“从这个角度看,这篇论文的确提出了一个非常新颖的思路。”
最后,伊利亚强调这个研究尚处在早期阶段,但他对此充满信心。
他说,每当他向其他研究人员介绍这篇论文时,他们的第一反应是说这个想法不可能实现,但紧接着他们便意识到事实并非如此,它可能无意间触及了一扇通往全新世界的大门。
道翰天琼CiGril机器人API
道翰天琼CiGril认知智能机器人API用户需要按步骤获取基本信息:
- 在平台注册账号
- 登录平台,进入后台管理页面,创建应用,然后查看应用,查看应用相关信息。
- 在应用信息页面,找到appid,appkey秘钥等信息,然后写接口代码接入机器人应用。
开始接入
请求地址:http://www.weilaitec.com/cigirlrobot.cgr
请求方式:post
请求参数:
参数 | 类型 | 默认值 | 描述 |
userid | String | 无 | 平台注册账号 |
appid | String | 无 | 平台创建的应用id |
key | String | 无 | 平台应用生成的秘钥 |
msg | String | "" | 用户端消息内容 |
接口连接示例:http://www.weilaitec.com/cigirlrobot.cgr?key=UTNJK34THXK010T566ZI39VES50BLRBE8R66H5R3FOAO84J3BV&msg=你好&ip=119.25.36.48&userid=jackli&appid=52454214552
注意事项:参数名称都要小写,五个参数不能遗漏,参数名称都要写对,且各个参数的值不能为空字符串。否则无法请求成功。userid,appid,key三个参数要到平台注册登录创建应用之后,然后查看应用详情就可以看到。userid就是平台注册账号。
示例代码JAVA:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class apitest {
/**
* Get请求,获得返回数据
* @param urlStr
* @return
*/
private static String opUrl(String urlStr)
{
URL url = null;
HttpURLConnection conn = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try
{
url = new URL(urlStr);
conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(5 * 10000);
conn.setConnectTimeout(5 * 10000);
conn.setRequestMethod("POST");
if (conn.getResponseCode() == 200)
{
is = conn.getInputStream();
baos = new ByteArrayOutputStream();
int len = -1;
byte[] buf = new byte[128];
while ((len = is.read(buf)) != -1)
{
baos.write(buf, 0, len);
}
baos.flush();
String result = baos.toString();
return result;
} else
{
throw new Exception("服务器连接错误!");
}
} catch (Exception e)
{
e.printStackTrace();
} finally
{
try
{
if (is != null)
is.close();
} catch (IOException e)
{
e.printStackTrace();
}
try
{
if (baos != null)
baos.close();
} catch (IOException e)
{
e.printStackTrace();
}
conn.disconnect();
}
return "";
}
public static void main(String args []){
//msg参数就是传输过去的对话内容。
System.out.println(opUrl("http://www.weilaitec.com/cigirlrobot.cgr?key=UTNJK34THXK010T566ZI39VES50BLRBE8R66H5R3FOAO84J3BV&msg=你好&ip=119.25.36.48&userid=jackli&appid=52454214552"));
}
}