CFCF2181L.LLM Training
省选/NOI-
通过率:0%
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
给定一个文本数据集。你的任务是训练一个大型语言模型(LLM),并找到最小可能损失。不开玩笑。
一个文本数据集由若干文本 t1,t2,…,tn 组成。每个文本 ti 是一个由多个 token 组成的序列。我们定义 token 集合 T 为至少在一个 ti 中出现过的所有 token 的集合。此外,对于每个文本 ti,还有一个位置集合 Li⊆{1,2,…,∣ti∣}。当 j∈Li 时,token ti[j] 由 LLM 生成。当 j∈/Li 时,该 token 由用户输入。
我们定义上下文长度为 k 的 LLM 为概率模型 Pk,它定义了下一个 token 的概率分布,并依赖于上下文 w——一个长度在 0 到 k(含)之间的、元素来自 T 的序列。因此概率模型 Pk 本质上是一个巨大的概率表,对每个上下文 w∈T∗,0≤∣w∣≤k 和每个 token next∈T,都给定 Pk(next∣w)。这些概率应满足 0≤Pk(next∣w)≤1,且 next∈T∑Pk(next∣w)=1。
LLM 损失函数如下定义,对于 Pk:
Lk(Pk)=i=1∑nj∈Li∑−log2Pk下一个 tokenti[j] 上下文ti[max(1,j−k)…j−1]
这里 ti[l..r]=ti[l]ti[l+1]…ti[r] 是从第 l 到第 r 个 token 的子串,ti[1..0] 表示空串。所以对于每个文本、每个由 LLM 生成的位置,我们将根据前 k 个 token(或整个前缀,如果长度不足 k)的子串,加上当前 token 的概率的负对数(以 2 为底)到损失中。如果概率为 0,则负对数视为 +∞。该损失函数称为(以 2 为底)的交叉熵损失(Cross Entropy Loss),只针对 LLM 生成的位置。Lk(Pk) 越小,LLM Pk 越好。
对于每个 0≤k<i=1..nmax∣ti∣,请计算某个具有上下文长度 k 的 LLM 所能达到的最小可能的损失 Lk(Pk)。可以证明,这个最小值是可达的且不是无穷大。
输入格式
第一行包含一个整数 n(1≤n≤105),表示数据集中文本的数量。接下来是每个文本的描述。
第 i 个文本的描述第一行为一个整数 mi(1≤mi≤3⋅105),表示 ti 的长度(mi=∣ti∣)。
下一行包含 mi 个字符串 ti[1]、ti[2]、…、ti[mi](1≤∣ti[j]∣≤5),为该文本的每个 token。每个 token 由 ASCII 码 33 至 126(可打印字符)的字符构成。
下一行包含一个长度为 mi 的字符串 ℓi,由字母 U 和 L 组成,编码了 Li。所有位置中,字母 L 处对应由 LLM 生成,U 则由用户输入。所以 Li={j∣ℓi[j]=L}。保证每个文本最后一个 token 都是 LLM 生成的,即 ℓi[mi]=L。
保证所有 mi 之和不超过 3⋅105。
输出格式
输出 M=i=1..nmaxmi 个实数:对于每个 k=0,1,…,M−1,输出最小可能损失 Lk(Pk),即所有可能的上下文长度为 k 的 LLM 的最小损失。
如果你的答案的绝对误差或相对误差不超过 10−6,即对于你的答案 p 和标准答案 q,有 max{1,∣q∣}∣p−q∣≤10−6,即视为正确。
输入输出样例
输入#1
4 5 1 + 1 = 2 UUUUL 5 1 + 2 = 3 UUUUL 5 2 + 1 = 3 UUUUL 5 2 + 2 = 4 UUUUL
输出#1
6.000000000000 6.000000000000 4.000000000000 4.000000000000 0.000000000000