Code for the Byte Pair Encoding algorithm, commonly used in LLM tokenization
github.com
github.com
I will say tokenization is UGLY. Really ugly. There are a ton of little, subtle, sharp edges and gotchas. Eternal glory awaits anyone who figures out a way to delete this stage.
There is research about getting rid of tokens, some of which is in that thread
https://github.com/karpathy/minbpe/blob/master/minbpe/base.p...
This code will incorrectly count pairs in [1,1,1] as two pairs of (1,1), despite there is only one, if you consider what merge function does. ;)
This can be seen in real world scenarios, for example, when there are many spaces.
My attempt to implement BPE has the same flaw and the fix appear to be very complex. But, as I looked at stats, it just makes such pairs to appear as top ones a couple of runs earlier, so it appears as a benign flaw. But, it's interesting that this is not mentioned in the code.
def get_corrected_stats(ids):
corrected_counts = {}
i = 0
while i < len(ids) - 1:
current_pair = (ids[i], ids[i+1])
# If the pair is new or if the current element is not a repeat of the previous one (or it's the first element)
if current_pair not in corrected_counts:
corrected_counts[current_pair] = 1
else:
if i == 0 or ids[i] != ids[i-1]:
corrected_counts[current_pair] += 1
# If the current and next element are the same, skip to the next unique element
if i < len(ids) - 2 and ids[i] == ids[i+1]:
while i < len(ids) - 1 and ids[i] == ids[i+1]:
i += 1
else:
i += 1
I have a basic grasp of this topic. Can you explain why the proposed solution is (or isn’t) effective in this scenario?Consider sequence [1,1,1,1,1,1]. We should count there 3 (three) (1,1) pairs. Karpathy's (and mine's) algorithm would count 5 pairs, yours' will count 1.
One should just skip one or two elements counting pairs, one element when pair's elements are different, two when they are same. This may break vectorization, though.
I also should note that error is here, but no-one hits it. My experiments show that (A,A) pairs gets counted as most frequent ahead of their natural turn about half a dozen symbols earlier. I also never saw that symbol B, assigned for pair (A,A), is used in any most frequent pair before an actual turn for (A,A). One need to construct special string for that to happen.
When I spotted this in my code, I did an investigation whether this affects my encoding. Turned out, it does not.
(Disclosure, it was published by my friend)
amateur here - but "Indic languages" are quite different. Maybe you mean Hindi and that group ?
(I cited it in my Excel tutorial on BPE https://www.youtube.com/watch?v=PvZN3-WqAOI&t=1916s )
I've been waiting for real innovation to come in tokenization algorithms. I think a truly well trained character level model would be awesome. Far easier to guide, and might even know how to "count" it's own output.
Now if only other OpenAI researchers would follow in his footsteps.
Probably not expressing this well but the concepts do seem similar to me