<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://thennal10.github.io/feed.xml" rel="self" type="application/atom+xml"/><link href="https://thennal10.github.io/" rel="alternate" type="text/html" hreflang="en"/><updated>2026-10-12T16:40:27+00:00</updated><id>https://thennal10.github.io/feed.xml</id><title type="html">blank</title><subtitle>Undergrad student, NLP researcher. </subtitle><entry><title type="html">The lost art of checking your sources</title><link href="https://thennal10.github.io/blog/2024/citations/" rel="alternate" type="text/html" title="The lost art of checking your sources"/><published>2024-10-24T00:00:00+00:00</published><updated>2024-10-24T00:00:00+00:00</updated><id>https://thennal10.github.io/blog/2024/citations</id><content type="html" xml:base="https://thennal10.github.io/blog/2024/citations/"><![CDATA[<p>While working on my latest paper (LLMs can be pruned if you’re using it for embedding!<d-cite key="l3prune"></d-cite>), I came across this absolute nugget of a citation in the LLM2VEC<d-cite key="llm2vec"></d-cite> paper:</p> <p><img src="/assets/img/datacanary.png" alt="A citation that goes hilfialkaff DataCanary, Jiang Lili, Risdal Meg, Dandekar Nikhil, and tomtung. Quora question pairs"/></p> <p>I’m no stranger to citing blog posts and web pages. Several useful and prominent resources <em>are</em> sometimes just hosted on a random webpage, or some service like HuggingFace or Kaggle. No shame in citing DataCanary et al. when you need to. In this case, however, the Kaggle link<d-footnote><a href="https://www.kaggle.com/competitions/quora-question-pairs">https://www.kaggle.com/competitions/quora-question-pairs</a></d-footnote> isn’t actually a dataset; it’s a competition, as you might’ve guessed from the URL. Predictably, it’s by Quora and is about classifying duplicate pairs:</p> <blockquote> <p>Currently, Quora uses a Random Forest model to identify duplicate questions. In this competition, Kagglers are challenged to tackle this natural language processing problem by applying advanced techniques to classify whether question pairs are duplicates or not.</p> </blockquote> <p>Competitions come with their own datasets, and the licensing for that is set by each competition runner. Good news for this one: the license is clearly visible and provided for the data, as part of the competition rules. Here’s a key excerpt:</p> <blockquote> <p>…Participants must use the Data solely for the purpose and duration of the Competition…</p> </blockquote> <details><summary>Full dataset license information</summary> <p>‘Data’ means the Data or Datasets linked from the Competition Website for the purpose of use by Participants in the Competition. For the avoidance of doubt, Data is deemed for the purpose of these Competition Rules to include any prototype or executable code provided to Participants by Kaggle or Competition Sponsor via the Website. Participants must use the Data only as permitted by these Competition Rules and any associated data use rules specified on the Competition Website.</p> <p>Unless otherwise permitted by the terms of the Competition Website, Participants must use the Data solely for the purpose and duration of the Competition, including but not limited to reading and learning from the Data, analyzing the Data, modifying the Data and generally preparing your Submission and any underlying models and participating in forum discussions on the Website. Participants agree to use suitable measures to prevent persons who have not formally agreed to these Competition Rules from gaining access to the Data and agree not to transmit, duplicate, publish, redistribute or otherwise provide or make available the Data to any party not participating in the Competition. Participants agree to notify Kaggle immediately upon learning of any possible unauthorized transmission or unauthorized access of the Data and agree to work with Kaggle to rectify any unauthorized transmission. Participants agree that participation in the Competition shall not be construed as having or being granted a license (expressly, by implication, estoppel, or otherwise) under, or any right of ownership in, any of the Data.</p> </details> <p>Oops. Quora Question Pairs turns out to not be licensed for research use! Except not, because while the Kaggle link is the <em>first</em> thing that comes up when you search it, the <em>third</em> one down is <a href="https://quoradata.quora.com/First-Quora-Dataset-Release-Question-Pairs">the dataset on the Quora website itself.</a> Surprise! It has actual authors!</p> <p><img src="/assets/img/qqp.png" alt="Quora Question Pairs page screenshot, with author names"/></p> <p>Specifically, Shankar Iyer, Nikhil Dandekar, and Kornél Csernai. So why exactly is renowned author hilfialkaff DataCanary cited instead?</p> <p>Just to be clear, the Kaggle one isn’t a unique permutation of it or anything: it’s the exact same dataset.<d-footnote>The Kaggle competition includes a test set, but I checked the data they used myself for any contamination, and none of the unique questions in the test set were sampled.</d-footnote> This isn’t just one paper, either. LLM2Vec took their dataset concoction from Springer et al<d-cite key="repetition"></d-cite>, who took it from Wang et al.<d-cite key="wang-etal-2024-improving-text"></d-cite>, both of whom attribute QQP to hilfialkaff DataCanary. In fact, a rudimentary search brought up <em>twenty-three</em> other papers<d-cite key="wang2024multilinguale5textembeddings,tang2024poolingattentioneffectivedesigns,zhang2023retrieveaugmentlargelanguage,khaokaew2024zzzgptinteractivegptapproach,muennighoff2024generativerepresentationalinstructiontuning,li2024makingtextembeddersfewshot,tejaswi2024rareretrievalaugmentedretrieval,10.1145/3583780.3615273,zhang-etal-2024-multi-task,pal2024the,groeneveld2023catwalkunifiedlanguagemodel,xiang-etal-2024-addressing,kurt2024companal,bhattacharjee2023phrasesumm,yuan-etal-2024-text,fung-etal-2024-agenda,fleshman2024readaptirimprovinginformationretrieval,sadraeijavaeri2024superpospromptenhancingsoftprompt,you2024when,pawar2024whatwhycontextlength,wang2023simgpttextsimilaritygpt,theron-2023-contextualizing,jiang2023generative"></d-cite> (and one thesis statement!<d-cite key="rinaldi2023exploring"></d-cite>) that cite good old DataCanary when they should be citing Iyer.</p> <p>Outside of being plain embarrassing, I think this is indicative of a pervasive attitude in NLP and AI research in general: a lack of care for dataset licensing and proper attribution. This is a particularly egregious example, and I’m genuinely surprised no one across these thirty-odd papers caught it (hilfialkaff DataCanary? <em>Really?</em>), but there are probably several similar misattributions that are sneakier in a <em>lot</em> of papers. As much as hunting for licenses is a pain in the ass, I think it’s a fairly good thing to expect papers to have a thorough licenses section (mine does it!). ACL seems to be moving towards that with their Responsible NLP checklist,<d-footnote><a href="https://aclrollingreview.org/responsibleNLPresearch">https://aclrollingreview.org/responsibleNLPresearch</a></d-footnote> but I don’t think it’s particularly enforced in any way. Might be good to get on that. Regardless, just check your citations, people.</p>]]></content><author><name></name></author><category term="nlp"/><category term="citations,"/><category term="sources,"/><category term="plagiarism"/><summary type="html"><![CDATA[Y'all, this is just getting embarrassing at this point.]]></summary></entry><entry><title type="html">Whisper’s evaluated metrics are kind of wrong for a bunch of languages</title><link href="https://thennal10.github.io/blog/2022/whisper/" rel="alternate" type="text/html" title="Whisper’s evaluated metrics are kind of wrong for a bunch of languages"/><published>2022-12-29T00:00:00+00:00</published><updated>2022-12-29T00:00:00+00:00</updated><id>https://thennal10.github.io/blog/2022/whisper</id><content type="html" xml:base="https://thennal10.github.io/blog/2022/whisper/"><![CDATA[<p>OpenAI’s Whisper paper<d-cite key="radford2023robust"></d-cite> includes the following passage in their <strong>Text Standardization</strong> subsection of the appendix:</p> <blockquote> <p>A different, language-specific set of transformations would be needed to equivalently normalize non-English text, but due to our lack of linguistic knowledge to build such normalizers for all languages, we resort to the following basic standardization for non-English text…</p> </blockquote> <p>As a person who also lacks linguistic knowledge, I admire the straightforwardness of just going “Yeah, we have no idea, so we just won’t bother”. However, they seem to be pretty accurate in their self-assessment, because the normalization they end up with still has a glaring issue.</p> <p>For a general ASR model like Whisper a rule of thumb is that it’s far better to train on raw data without any normalization: the model can learn to predict peripheral language features such as capitalization and punctuation given enough training data, and so a denormalization step is not required in actual application. Evaluation, however, is done with normalized text so that a dataset’s specific idiosyncrasies don’t reflect in the reported evaluation metric. In testing out the normalization function used by OpenAI, I plugged in some Malayalam text thinking I’d get basically the same thing back minus the punctuation:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ഞാൻ കേൾക്കാൻ ആഗ്രഹിക്കുന്ന വാക്കുകൾ കൊണ്ട് ഞാൻ എപ്പോഴും ജനങ്ങളെ ആശ്വസിപ്പിക്കാൻ ശ്രമിക്കുന്നു
</code></pre></div></div> <p>Instead, I got <em>this</em> abomination:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ഞ ൻ ക ൾക ക ൻ ആഗ രഹ ക ക ന ന വ ക ക കൾ ക ണ ട ഞ ൻ എപ പ ഴ ജനങ ങള ആശ വസ പ പ ക ക ൻ ശ രമ ക ക ന ന
</code></pre></div></div> <p>The culprit is pretty easy to find, right after the aforementioned passage:</p> <blockquote> <p>Replace any markers, symbols, and punctuation characters with a space, i.e. when the Unicode category of each character in the NFKC-normalized string starts with M, S, or P</p> </blockquote> <p>Unicode categories<d-cite key="unicode16"></d-cite> that start with P are indeed punctuations, and those that start with S are indeed symbols (currency, math, etc.), and it makes sense to remove both. Marks are a lot less obvious. There are three mark categories: Spacing Mark (Mc), Enclosing Mark (Me), and Nonspacing Mark (Mn). Enclosing marks consists of a dozen or so symbols that, well, enclose other characters. Most renderers don’t even support it, and a quick visual inspection is enough to convince anyone that these characters can be safely discarded. Spacing marks and nonspacing marks, however, are almost <em>completely composed of diacritics in various languages</em>, chiefly Indo-Aryan and Dravidian. Removing these characters and replacing them with whitespace usually gets you gibberish.</p> <p>A direct look at their code reveals a direr state of affairs. By default, the normalizer calls a function <code class="language-plaintext highlighter-rouge">remove_symbols</code> that removes all characters whose Unicode category starts with M, S, or P, consistent with the paper:</p> <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">remove_symbols</span><span class="p">(</span><span class="n">s</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
	<span class="sh">"""</span><span class="s">
	Replace any other markers, symbols, punctuations with a space, keeping diacritics
	</span><span class="sh">"""</span>
	<span class="k">return</span> <span class="sh">""</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span>
	<span class="sh">"</span><span class="s"> </span><span class="sh">"</span> <span class="k">if</span> <span class="n">unicodedata</span><span class="p">.</span><span class="nf">category</span><span class="p">(</span><span class="n">c</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="sh">"</span><span class="s">MSP</span><span class="sh">"</span> <span class="k">else</span> <span class="n">c</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">unicodedata</span><span class="p">.</span><span class="nf">normalize</span><span class="p">(</span><span class="sh">"</span><span class="s">NFKC</span><span class="sh">"</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
	<span class="p">)</span>
</code></pre></div></div> <p>However, if you set the parameter <code class="language-plaintext highlighter-rouge">remove_diacritics</code> to <code class="language-plaintext highlighter-rouge">True</code>, you instead get:</p> <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">remove_symbols_and_diacritics</span><span class="p">(</span><span class="n">s</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">keep</span><span class="o">=</span><span class="sh">""</span><span class="p">):</span>
	<span class="sh">"""</span><span class="s">
	Replace any other markers, symbols, and punctuations with a space,
	and drop any diacritics (category </span><span class="sh">'</span><span class="s">Mn</span><span class="sh">'</span><span class="s"> and some manual mappings)
	</span><span class="sh">"""</span>
	<span class="k">return</span> <span class="sh">""</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span>
		<span class="n">c</span>
		<span class="k">if</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">keep</span>
		<span class="k">else</span> <span class="n">ADDITIONAL_DIACRITICS</span><span class="p">[</span><span class="n">c</span><span class="p">]</span>
		<span class="k">if</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">ADDITIONAL_DIACRITICS</span>
		<span class="k">else</span> <span class="sh">""</span>
		<span class="k">if</span> <span class="n">unicodedata</span><span class="p">.</span><span class="nf">category</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="o">==</span> <span class="sh">"</span><span class="s">Mn</span><span class="sh">"</span>
		<span class="k">else</span> <span class="sh">"</span><span class="s"> </span><span class="sh">"</span>
		<span class="k">if</span> <span class="n">unicodedata</span><span class="p">.</span><span class="nf">category</span><span class="p">(</span><span class="n">c</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="sh">"</span><span class="s">MSP</span><span class="sh">"</span>
		<span class="k">else</span> <span class="n">c</span>
		<span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">unicodedata</span><span class="p">.</span><span class="nf">normalize</span><span class="p">(</span><span class="sh">"</span><span class="s">NFKD</span><span class="sh">"</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
<span class="p">)</span>
</code></pre></div></div> <p>Here, they seem to realize that marks indeed include diacritics, and they omit nonspacing marks instead of replacing it with a whitespace. This is actually <em>marginally better</em> than what <code class="language-plaintext highlighter-rouge">remove_symbols</code> does to diacritics, and this points to the the fundamental blunder being more “we didn’t proofread our code” and less “we didn’t check what Unicode categories meant”.</p> <p>As we see before, OpenAI admits their normalization for anything non-English is barebones. Particularly for languages with no clear demarcation between words, it splits sentences into a sequence of characters, functionally measuring the <strong>CER</strong> (character error rate) instead of the reported <strong>WER</strong> (word error rate). This makes sense as a quick and clean solution: their numbers are measuring the wrong thing, but they acknowledge it. However, nowhere in the paper do they acknowledge that they do the same thing to a laundry list of languages that <em>do</em> have a clear demarcation between words: the same one that every other modern language uses. In the end, what you functionally get after normalization is a Frankenstein between CER and WER for languages unlucky enough to be using a particular class of diacritics.</p> <p>Since this is the normalization they used to get their reported results, I reevaluated the medium model on the FLEURS dataset for all potentially affected languages with normalization that doesn’t just fling away diacritics to see if there was any real difference. Sure enough:</p> <table> <thead> <tr> <th>Language</th> <th>WER (OpenAI)</th> <th>WER (Mine)</th> <th>Difference</th> </tr> </thead> <tbody> <tr> <td>Arabic</td> <td>20.4</td> <td>27.9</td> <td><span style="color:red"> -7.5 </span></td> </tr> <tr> <td>Assamese</td> <td>102.3</td> <td>161.2</td> <td><span style="color:red"> -58.9 </span></td> </tr> <tr> <td>Bengali</td> <td>100.6</td> <td>134.9</td> <td><span style="color:red"> -34.3 </span></td> </tr> <tr> <td>Persian</td> <td>41.0</td> <td>48.0</td> <td><span style="color:red"> -7.0 </span></td> </tr> <tr> <td>Gujarati</td> <td>104.8</td> <td>117.8</td> <td><span style="color:red"> -13.0 </span></td> </tr> <tr> <td>Hindi</td> <td>26.8</td> <td>58.1</td> <td><span style="color:red"> -31.3 </span></td> </tr> <tr> <td>Khmer</td> <td>98.9</td> <td>287.8</td> <td><span style="color:red"> -188.9 </span></td> </tr> <tr> <td>Kannada</td> <td>77.7</td> <td>109.8</td> <td><span style="color:red"> -32.1 </span></td> </tr> <tr> <td>Malayalam</td> <td>101.1</td> <td>121.2</td> <td><span style="color:red"> -20.1 </span></td> </tr> <tr> <td>Marathi</td> <td>63.2</td> <td>109.8</td> <td><span style="color:red"> -46.6 </span></td> </tr> <tr> <td>Nepali</td> <td>54.4</td> <td>114.4</td> <td><span style="color:red"> -60.0 </span></td> </tr> <tr> <td>Punjabi</td> <td>102.0</td> <td>125.9</td> <td><span style="color:red"> -23.9 </span></td> </tr> <tr> <td>Pashto</td> <td>119.4</td> <td>170.0</td> <td><span style="color:red"> -50.6 </span></td> </tr> <tr> <td>Sindhi</td> <td>147.0</td> <td>129.6</td> <td><span style="color:green"> 17.4 </span></td> </tr> <tr> <td>Tamil</td> <td>23.1</td> <td>54.9</td> <td><span style="color:red"> -31.8 </span></td> </tr> <tr> <td>Telugu</td> <td>82.8</td> <td>122.4</td> <td><span style="color:red"> -39.6 </span></td> </tr> <tr> <td>Urdu</td> <td>28.2</td> <td>41.8</td> <td><span style="color:red"> -13.6 </span></td> </tr> <tr> <td>Yoruba</td> <td>105.1</td> <td>172.7</td> <td><span style="color:red"> -67.6 </span></td> </tr> </tbody> </table> <p>Every single language had a deflated WER, with the exception of Sindhi (not really sure what’s going on there). Granted, Whisper did hopelessly terrible in most of these languages to begin with (WER over 100% not really a good look), but Tamil, Hindi, and Urdu strike me as three languages where the discrepancy <em>does</em> make a difference: 25%ish is a manageable WER, 55% less so.</p> <p>This becomes even more of an issue when people keep using the same damn normalization function for finetuned model evaluation, like in the <a href="https://github.com/huggingface/community-events/tree/main/whisper-fine-tuning-event">Hugging Face Whisper Finetune Sprint</a>, where the leaderboard for these languages is basically curated misinformation.</p> <p>An easy out would be to use the CER: this makes everything more or less consistent for all languages and prevents issues with scripto continua writing systems and agglutinative languages. That said, this is a pervasive issue with non-English NLP research in general, where evaluation and its metrics are optimized exclusively for English, but I digress. Next time around, I hope OpenAI uses all the money they saved from underpaying and mentally scarring Kenyan workers<d-cite key="perrigo2023openai"></d-cite> to hire a linguist, or at very least, a proofreader.</p>]]></content><author><name></name></author><category term="nlp"/><category term="whisper,"/><category term="normalization,"/><category term="evaluation"/><summary type="html"><![CDATA[TL;DR: Bad normalization]]></summary></entry><entry><title type="html">Mnemonics are useless</title><link href="https://thennal10.github.io/blog/2021/menomics/" rel="alternate" type="text/html" title="Mnemonics are useless"/><published>2021-06-23T00:00:00+00:00</published><updated>2021-06-23T00:00:00+00:00</updated><id>https://thennal10.github.io/blog/2021/menomics</id><content type="html" xml:base="https://thennal10.github.io/blog/2021/menomics/"><![CDATA[<p>I’ve never really understood the urge people get to try and learn Japanese after they get sufficiently into anime. I imagine this comes across as hypocritical from someone who’s been studying the language a good year for the sole reason of understanding Vtubers, but back when I was <em>just</em> into anime, it never even crossed my mind to attempt to learn Japanese. It seemed like a utterly unnecessary exercise: all the Japanese media I consumed at the time invariably had translations, and I had a vague enough idea of the difficulty in learning another language that doing it for the clout was way too much effort. I guess that’s the part a lot of people somehow miss: language learning is <em>ridiculously</em> hard if you don’t have the sufficient motivation or circumstance.<d-footnote>In my case, motivation was abundant (I had entrance exams that year) and I was going to consume hours of raw Japanese Vtuber streams whether I learned the language or not.</d-footnote></p> <p>All my friends who started learning Japanese after I did tapped out pretty quickly. Flimsy motivations notwithstanding, they also tapped out at the first real challenge in the entire process: cramming hundreds of words into your head as a baseline before you actually start immersing in the language. While I imagine this process is universal across all languages, Japanese also has the additional issue of the Kanji (漢字) system.</p> <p>Japanese has two syllabaries: Hiragana (ひらがな) and Katakana (カタカナ). They’re pretty simple: 46 characters each, and they’re used to write out the sounds of the language. Hiragana is used for native Japanese words, and Katakana is used for foreign words. Kanji are the 10 thousand or so Chinese characters that form the third fundamental part of the Japanese writing system. They’re a necessary evil: a lack of word boundaries means you can’t read the language otherwise, and even if you put in spaces between words completely written in Hiragana,<d-footnote>Nintendo games and other children's media do this, for the kiddies who are learning.</d-footnote> it’s still <em>much</em> harder to read than if you just knew the Kanji, because of Japanese’s restricted syllabary and the homophones that result.</p> <p>Learning Kanji is an arduous task, and as such there have been a lot of debate in the community as to the most efficient way to cram in these initially inexplicable moonrunes. One common way is to build it up from raw materials: kanji generally are made of radicals, and the meaning of each kanji is <em>sometimes</em> associated with the radicals it’s made of. A natural extension of this, and the method I used initially, is the Remembering The Kanji (RTK) method.</p> <p>The RTK Method associates each Kanji with a mnemonic based on the radicals<d-footnote>I said radicals here for simplicity, but the actual radicals and the defined "components" the RTK method uses are different.</d-footnote> it’s made of. For example, the Kanji for “tree” (木) is made of the radicals for “tree” and “one” (一), and the mnemonic for it is “A tree is one thing”. Much like all mnemonics, the idea is that the mnemonic is easier to remember than the actual Kanji, and that the mnemonic will eventually be replaced by the actual meaning of the Kanji.</p> <p>That doesn’t happen.</p> <p>It just doesn’t.</p> <h2 id="mnemonics-are-a-practically-unnecessary-crutch">Mnemonics are a practically unnecessary crutch</h2> <p>Say you hit a Kanji which you don’t immediately recognize, but which you’ve “learnt” via the RTK method. You now have to pause reading, remember the mnemonic, go through it in your head<d-footnote>Probably some garbage like this mnemonic for 喻, for instance: "A meeting of butchers is a perfect metaphor for the supposed secret talks(mouth) between Hitler and Stalin"</d-footnote>, and finally remember what the kanji meant. Fun fact! That took you 10 seconds, and you still don’t know how to read it, because the mnemonic only taught you the meaning, not how to pronounce it. How do you learn the pronunciation? Most Kanji have multiple pronounciations (usually called readings), so generally the idea is to just learn it on a word-by-word basis. So why not just learn the damn words in the first place?</p> <p>This is my core issue with mnemonics. They’re a crutch that’s functionally unnecessary if you’re actually going to be using the information you’re trying to remember. Recall is only useful if it’s <em>fast.</em> Slow recall may as well be equivalent to not knowing the information at all, because guess what? We all have the Library of Babel in our pockets. We have the All-Knowning Information Box just sitting there, and we all have the muscle memory to look things up faster than we could spit out the damn mnemonic.</p> <p>The only time mnemonics are useful is when you’re in an environment where you <em>can’t</em> look things up, and it’s sort of fine to take your time to remember it. I posit that most of these environments are either contrived or outdated: the most egregious offender being exams. They should be open book anyway if you actually want to test the material in any rigorous fashion; If your exam can be aced if you have your notes with you, then it isn’t a very good exam to begin with. The only other situations I can think of is something like surgery, where you might not have the luxury of whipping out your phone during someone’s heart transplant, but could spare the seconds to mnemonic out the rib bones or whatever. Still, I don’t know about you but I definitely wouldn’t want my surgeon to be relying on a mnemonic to remember where the liver is.</p> <h2 id="mnemonics-replace-understanding">Mnemonics replace understanding</h2> <p>In some cases, you shouldn’t be memorizing at all. Once you actually understand the topic, whatever you’re trying to remember becomes trivial as you figure out the underlying structure. Education that focuses on memorization over understanding is doomed to fail.</p> <p>As someone who went to school in India, this is a reoccurring cliche across basically every single subject. But even for educational systems that aren’t utter dogshit, there still exists remnants. Mnemonics are a notable canary in the coal mine.</p> <p>Let’s take trignometry. Two well-known mnemonics here: <strong>SOH-CAH-TOA</strong> and <strong>All S</strong>tudents <strong>T</strong>ake <strong>C</strong>alculus.</p> <h4 id="soh-cah-toa">SOH-CAH-TOA</h4> <p>A nice clean mnemonic for remembering how the basic trigonometric functions relate to the sides of a triangle:</p> <blockquote> <p><strong>S</strong>ine = <strong>O</strong>pposite ÷ <strong>H</strong>ypotenuse</p> </blockquote> <blockquote> <p><strong>C</strong>osine = <strong>A</strong>djacent ÷ <strong>H</strong>ypotenuse</p> </blockquote> <blockquote> <p><strong>T</strong>angent = <strong>O</strong>pposite ÷ <strong>A</strong>djacent</p> </blockquote> <p><img src="/assets/img/sohcahtoa.png" alt="SOH-CAH-TOA"/></p> <p>Now, this one is bad on the face of it. Trigonometry is used so consistently in your school education that needing a mnemonic to remember this is unnecessary by itself. However, this framing also fundamentally misunderstands the trigonometric functions. They are <em>not</em> about triangles, they’re about <strong>circles</strong>.</p> <p>Indeed, the only reason we usually care about the trigonometric functions is because for a particular point on the circle, its coordinates \((x, y)\) is \((\cosθ,\sinθ)\).</p> <p><img src="/assets/img/circle.png" alt="Unit Circle" width="250"/></p> <p>It is in this context where trigonometry is actually <em>useful</em>. This perspective is the fundamental to further understanding down the line as trigonometry pops up again and again in different contexts. 3Blue1Brown makes this point way better than I can in <a href="https://www.youtube.com/watch?v=yBw67Fb31Cs">this</a> video where he teaches trigonometry fundamentals, so give that a watch.</p> <p>Now, while \(\sin\) and \(\cos\) are the main two, all trigonometric functions are indeed foundationally mapped on the circle:</p> <p><img src="/assets/img/trig_functions.png" alt="Trig Functions" width="250"/></p> <p>\(\cot\), \(\csc\) and \(\cot\) are for the most part remnants of an era where math’s most practical application was marine navigation. \(\tan\) is, well, the <em>tangent</em>, so being the length of the tangent where it intersects the x-axis makes sense. Practically, you don’t even need to remember what it represents, just how it relates to \(\sin\) and \(\cos\).</p> <p>What you’re left to memorize then is that \(\sin\theta\) is \(y\), \(\cos\theta\) is \(x\), and \(\tan\) is \(\frac{\sin\theta}{\cos\theta}\). For circles of a non-unit radius \(r\), the functions would scale too. Considering \(r\) is actually the hypotenuse of the triangle in question, one can derive pretty easily the relations with the sides.</p> <p>Now, you might complain that this isn’t that big of a reduction in memory. Indeed, with the mnemonic, it’s true that the original is probably easier to immediately cram into your head. However the original perspective is antithetical to an actual understanding of what you’re doing, and makes things harder later down the line. Case in point: the quadrants.</p> <h4 id="all-students-take-calculus-or-any-of-its-million-variations">All Students Take Calculus (or any of its million variations)</h4> <p>The Cartesian plane can be subdivided into quadrants depending on the sign of the axis, and in each quadrant the signs of the trigonometric functions vary:</p> <ul> <li>Quadrant I (angles from 0 to 90 degrees, or 0 to π/2 radians): <strong>All</strong> trigonometric functions are positive in this quadrant.</li> <li>Quadrant II (angles from 90 to 180 degrees, or π/2 to π radians): <strong>S</strong>ine and cosecant functions are positive in this quadrant.</li> <li>Quadrant III (angles from 180 to 270 degrees, or π to 3π/2 radians): <strong>T</strong>angent and cotangent functions are positive in this quadrant.</li> <li>Quadrant IV (angles from 270 to 360 degrees, or 3π/2 to 2π radians): <strong>C</strong>osine and secant functions are positive in this quadrant. The following image uses <strong>All</strong> <strong>S</strong>cience <strong>T</strong>eachers (are) <strong>C</strong>razy but the concept is the same:</li> </ul> <p><img src="/assets/img/quadrants.png" alt="Quadrants"/></p> <p>An innocuous tool to memorize mathematical facts, one might say. After all, how would one remember the signs of each trigonometric functions given their angle otherwise? Maybe, I don’t know, looking at where it is on the <em>fucking circle</em>.</p> <p>The signs of \(x\) and \(y\), the defining feature of each quadrant <em>directly</em> give you the signs of \(\sin\) and \(\cos\), and deriving the sign of the rest of the trigonometric functions still takes less time than reciting that dumbass mnemonic.</p> <p>Many of the conversions in trigonometry become intuitive and quick when this understanding kicks in. Why is \(\sin\theta = -\sin(2\pi - \theta)\)? Just look at the circle! \(\sin\theta = \cos(\frac{\pi}{2} - \theta)\)? Keep in mind the axes, and summon the circle! Want to visualize the function? Rotate around the goddamn circle!</p> <p>It’s frankly a disgrace: students are given a dumb mnemonic that both robs proper learning and makes things <em>harder</em> to remember in the end. While the mnemonic itself is not necessarily the root of the problem, it’s indicative of a fundamentally incurious form of learning; one that would rather memorize than understand. That’s just sad. <em>Nobody</em> should have to remember <em>All Students Take Calculus</em>.</p> <h2 id="final-notes">Final Notes</h2> <p>I imagine a lot of the members in the Memorization community will have several qualms about the opinions I’ve expressed here. So I’ll temper my piece with this: mnemonics are good at what they’re designed to do. They are uniquely effective in letting you memorize (given leeway in terms of recall time) unconnected, disjointed information in large quantities. There’s a reason why literally every memory sports champion uses some form of mnemonics, and it’s the ideal way of learning e.g. the digits of \(\pi\), for instance. I’ll give that to you, mnemonics: you work. I just don’t think you’re very useful.</p>]]></content><author><name></name></author><category term="misc"/><category term="education"/><summary type="html"><![CDATA[In the age of the internet, the mnemonic is a relic from a bygone era.]]></summary></entry></feed>