<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Harsh Gupta on Medium]]></title>
        <description><![CDATA[Stories by Harsh Gupta on Medium]]></description>
        <link>https://medium.com/@harshnkgupta?source=rss-8ee61db420f1------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*R7ir2z2KLMkDLD-hFhxI-w.jpeg</url>
            <title>Stories by Harsh Gupta on Medium</title>
            <link>https://medium.com/@harshnkgupta?source=rss-8ee61db420f1------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 28 May 2026 17:01:26 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@harshnkgupta/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Deep Dive into RAFT: Why Combining Approaches is Key]]></title>
            <link>https://medium.com/@harshnkgupta/deep-dive-into-raft-why-combining-approaches-is-key-47079e80a719?source=rss-8ee61db420f1------2</link>
            <guid isPermaLink="false">https://medium.com/p/47079e80a719</guid>
            <category><![CDATA[intuitive]]></category>
            <category><![CDATA[fine-tuning]]></category>
            <category><![CDATA[beginners-guide]]></category>
            <category><![CDATA[retrieval-augmented-gen]]></category>
            <category><![CDATA[large-language-models]]></category>
            <dc:creator><![CDATA[Harsh Gupta]]></dc:creator>
            <pubDate>Tue, 21 May 2024 02:47:34 GMT</pubDate>
            <atom:updated>2024-05-21T02:47:34.214Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/520/1*JySB8IfhM0HDFALkJxvstA.gif" /></figure><p>Large Language Models (LLMs) have become increasingly adept at understanding and responding to human language. However, their performance can suffer when dealing with specialized domains or requiring access to factual information. This is where Retrieval Augmented Fine-Tuning (RAFT) comes in, offering a powerful technique to enhance LLMs for specific tasks.</p><h3>Understanding the Building Blocks: RAG and Fine-Tuning</h3><ul><li><strong>Retrieval-Augmented Generation (RAG):</strong> This approach allows LLMs to consult external knowledge sources like documents or databases during text generation. RAG follows a two-step process: first, it retrieves relevant information from the external source based on the prompt or question. Then, it utilizes this retrieved information to generate a response.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KQR1W2AEj9S06roTGWtK2g.gif" /><figcaption>RAG Workflow</figcaption></figure><ul><li><strong>Fine-Tuning:</strong> This is a common LLM training method where the model is exposed to a large amount of data specific to a particular domain. Through this focused training, the model learns the nuances and terminology relevant to that domain, improving its performance in those areas.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*U1pDAeIrj9Hxh4DnFZMsAw.gif" /><figcaption>LoRA (Low Rank Adaptation for LLMs)</figcaption></figure><h3><strong>Weaknesses of Retrieval Augmented Generation (RAG):</strong></h3><figure><img alt="https://gorilla.cs.berkeley.edu/blogs/9_raft.html" src="https://cdn-images-1.medium.com/max/462/1*wkdSKuvyZMaAN7oKc6zHDA.png" /><figcaption><a href="https://gorilla.cs.berkeley.edu/blogs/9_raft.html">https://gorilla.cs.berkeley.edu/blogs/9_raft.html</a></figcaption></figure><ul><li><strong>Limited Domain Knowledge:</strong> RAG relies on retrieving relevant information from external sources. However, it doesn’t explicitly train the LLM on the intricacies and nuances of a specific domain. This can lead to responses that, while factually accurate based on the retrieved information, might lack the depth and understanding expected in domain-specific tasks.</li><li>For example, imagine an LLM trained with RAG for a legal question-answering system. RAG might retrieve the relevant legal document from a database. But without understanding the legal context and interpretations, the LLM might struggle to explain the code in a way that’s clear and applicable to the specific legal issue.</li><li><strong>Retrieval Relevance:</strong> The effectiveness of RAG heavily depends on the retrieval mechanism’s ability to identify truly relevant information. Poorly chosen or irrelevant retrieved documents can lead the LLM to generate misleading or inaccurate responses.</li></ul><h3><strong>Weaknesses of Traditional Fine-Tuning:</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/473/1*I4YS_w8rVdqelbyb9sgvRw.png" /><figcaption><a href="https://gorilla.cs.berkeley.edu/blogs/9_raft.html">https://gorilla.cs.berkeley.edu/blogs/9_raft.html</a></figcaption></figure><ul><li><strong>Limited Access to External Knowledge:</strong> Fine-tuning focuses on training the LLM with domain-specific data. While this improves the model’s understanding of the domain, it lacks access to external information during response generation. This can be problematic for tasks that require factual grounding beyond the training data.</li><li>Consider a fine-tuned LLM for summarizing scientific research papers. The model might be able to accurately summarize the information presented in the training data. However, if a novel scientific discovery not present in the training data is mentioned in the prompt, the LLM wouldn’t be able to access and integrate that information into its summary.</li><li><strong>Data Bottleneck:</strong> Fine-tuning often requires large amounts of high-quality domain-specific data. This data can be expensive and time-consuming to acquire, especially for niche domains.</li></ul><h3>RAFT: Combining Strengths for Improved Performance</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/509/1*FHAvH4NFwDweNbb3OCuztw.png" /><figcaption><a href="https://gorilla.cs.berkeley.edu/blogs/9_raft.html">https://gorilla.cs.berkeley.edu/blogs/9_raft.html</a></figcaption></figure><p>RAFT bridges the gap between these two approaches. It leverages the strengths of both RAG and fine-tuning to create a more effective training methodology for LLMs in specific domains. Here’s how it works:</p><ol><li><strong>Specialized Training:</strong> Similar to fine-tuning, RAFT first trains the LLM on a dataset relevant to the target domain. This allows the model to grasp the core concepts and terminology used in that domain.</li><li><strong>Retrieval Integration:</strong> After the initial training, RAFT incorporates a retrieval mechanism. When the LLM encounters a prompt or question, it retrieves relevant documents from the external knowledge source.</li><li><strong>Enhanced Response Generation:</strong> Equipped with both the domain knowledge from the training data and the retrieved information, the LLM generates a response that is not only factually grounded but also tailored to the specific domain.</li></ol><h3><strong>Benefits of RAFT:</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/812/1*NilDDjuo8Clo8V3nmsKqAQ.png" /><figcaption><a href="https://gorilla.cs.berkeley.edu/blogs/9_raft.html">https://gorilla.cs.berkeley.edu/blogs/9_raft.html</a></figcaption></figure><ul><li><strong>Improved Accuracy:</strong> By providing access to factual information, RAFT helps LLMs generate more accurate and reliable responses.</li><li><strong>Reduced Hallucination:</strong> LLMs can sometimes fabricate information, leading to nonsensical outputs. RAFT’s reliance on external knowledge sources helps mitigate this issue.</li><li><strong>Better Domain Adaptation:</strong> RAFT allows LLMs to excel in specific domains by combining specialized training with access to relevant external information.</li></ul><p>Overall, RAFT presents a promising approach for pushing LLMs towards becoming more reliable and effective tools for tasks requiring domain-specific knowledge and factual grounding.</p><h3><strong>Further Exploration:</strong></h3><p>This blog provides a high-level overview of RAFT. If you’d like to delve deeper, consider exploring the following resources:</p><ul><li>RAFT research paper: [arxiv.org]([2403.10131] RAFT: Adapting Language Model to Domain Specific RAG)</li><li><a href="https://www.superannotate.com/blog-category/ai">https://www.superannotate.com/blog-category/ai</a></li><li><a href="https://www.capestart.com/resources/blog/what-is-retrieval-augmented-fine-tuning/">https://www.capestart.com/resources/blog/what-is-retrieval-augmented-fine-tuning/</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=47079e80a719" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Revolutionize Fine-Tuning: Reduce Training Time and Memory Usage with LoRA]]></title>
            <link>https://medium.com/@harshnkgupta/revolutionize-fine-tuning-reduce-training-time-and-memory-usage-with-lora-51352cd6394d?source=rss-8ee61db420f1------2</link>
            <guid isPermaLink="false">https://medium.com/p/51352cd6394d</guid>
            <category><![CDATA[low-rank-adaptation]]></category>
            <category><![CDATA[intuition]]></category>
            <category><![CDATA[beginners-guide]]></category>
            <category><![CDATA[large-language-models]]></category>
            <category><![CDATA[fine-tuning]]></category>
            <dc:creator><![CDATA[Harsh Gupta]]></dc:creator>
            <pubDate>Thu, 09 May 2024 11:58:20 GMT</pubDate>
            <atom:updated>2024-05-09T12:09:50.005Z</atom:updated>
            <content:encoded><![CDATA[<p>The world of deep learning is witnessing an explosion in model size. Take large language models (LLMs) for instance — GPT-4 boasts a mind-boggling 1.8 trillion parameters! While these behemoths hold immense potential, their sheer size presents a challenge: fine-tuning them on custom datasets. This process, crucial for real-world applications, becomes computationally expensive due to the sheer number of parameters to adjust.</p><p>This blog delves into LoRA (Low-Rank Adaptation), a game-changer for fine-tuning these giants. But before diving into LoRA, let’s explore some fundamental concepts for handling large models effectively.</p><h3><strong>The Burden of Big: Precision, Quantization, and the Memory Crunch</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*OnNV3nimmdA2i5X2JhtnFg.gif" /><figcaption>Credit: huggingface</figcaption></figure><ul><li><strong>Precision vs. Accuracy:</strong> Deep learning models typically store weights using floating-point numbers (float32). However, this comes at a memory cost. Techniques like half-precision (float16) reduce memory usage by sacrificing some precision, potentially introducing rounding errors.</li><li><strong>Quantization to the Rescue:</strong> Quantization takes things a step further, allowing even lower precision (e.g., int8) while maintaining performance. It essentially translates weights into a more compact format without significant loss of accuracy.</li></ul><h3><strong>Fine-Tuning Techniques: A Balancing Act</strong></h3><ul><li><strong>The Traditional Way (Freezing Weights):</strong> This method keeps most of the model’s weights frozen, only training a small “head” for the specific task. While efficient, it limits access to the model’s rich internal representations, hindering performance.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*v5DE2S3YjImZypy6o3qLqQ.png" /><figcaption>Specific Head Training</figcaption></figure><ul><li><strong>Adapter Layers: A Sophisticated Approach:</strong> These layers are inserted between existing layers in the model, allowing for more fine-tuning. However, they can increase latency and computational complexity.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9zp_JV_qfzj4yNJkLRenaw.jpeg" /><figcaption>Adapter Layers</figcaption></figure><ul><li><strong>Prefix Tuning: Lightweight but Limited Control:</strong> This method modifies the input data with task-specific prefixes, offering a lightweight approach but with limited control over the overall model behavior.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/932/1*zsMRvEOsj63RgiT_IvqQ8g.png" /><figcaption>Prefix Tuning</figcaption></figure><h3><strong>LoRA: Unveiling the Intrinsic Dimensionality</strong></h3><p>LoRA takes a radically different approach. It leverages the concept of intrinsic dimensionality, which suggests that a smaller set of weights within a large model can capture the essence of a new task. Here’s how it works:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*U1pDAeIrj9Hxh4DnFZMsAw.gif" /><figcaption>Working of LoRA</figcaption></figure><ul><li><strong>Rank Decomposition:</strong> LoRA focuses on the update to the model’s weights during fine-tuning (delta W). It utilizes a powerful mathematical technique called rank decomposition to represent delta W as a product of two low-rank matrices (B and A). Imagine a massive matrix — delta W. LoRA breaks it down into two smaller matrices, each with a much lower rank (meaning fewer independent rows or columns).</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Tqolxo_LHdVJ0A0CXQQxQQ.png" /><figcaption>Low Rank Decomposition</figcaption></figure><ul><li><strong>Benefits Galore:</strong> This decomposition significantly reduces the number of trainable parameters compared to full fine-tuning. It’s like compressing a complex update into a more manageable form.</li></ul><h3><strong>Why LoRA is a Winner</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WkAQcUZRvdwapR0H-3N3vg.jpeg" /></figure><ul><li><strong>Less is More:</strong> Fewer trainable parameters translate to faster training times and lower memory requirements, making LoRA ideal for resource-constrained environments.</li><li><strong>Seamless Integration:</strong> LoRA weights (delta W) can be easily merged with the original model for inference. This eliminates the overhead associated with techniques like adapter layers.</li><li><strong>Model Zoo for Every Task:</strong> Different LoRA weights can be created for various downstream tasks, essentially creating a “model zoo” tailored to a specific foundation model (e.g., GPT-4).</li></ul><h3><strong>Putting LoRA into Practice: The Power of Hugging Face</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YQalABK7gftESAJ9AuO1AQ.png" /></figure><p>The Hugging Face library, a haven for deep learning enthusiasts, offers a user-friendly implementation of LoRA through its Parameter-Efficient Fine-Tuning (PFT) module. Functions like get_lora_model handle the rank decomposition for you, allowing easy configuration of target modules (e.g., Transformer layers) within the model.</p><h3><strong>LoRA Meets Quantization: A Match Made in Deep Learning Heaven</strong></h3><p>For an extra boost in efficiency, LoRA can be combined with quantization techniques like Q-LoRA. This approach quantizes the pre-trained model weights, further reducing hardware requirements for training and deployment.</p><h3><strong>The Future of Fine-Tuning: Smaller Footsteps, Giant Leaps</strong></h3><p>LoRA represents a significant leap forward in fine-tuning massive deep learning models. It empowers developers to leverage the power of these giants without the usual computational burden. As research in this area continues, expect even more innovative techniques that unlock the true potential of these colossal language models.</p><p><strong>Beyond the Blog:</strong> This blog provides a springboard for further exploration. Dive deeper into the research papers on LoRA and Q-LoRA to gain a more technical understanding. Experiment with LoRA using the Hugging Face library and witness the power of fine-tuning with fewer parameters. The future of deep learning is efficient, and LoRA is paving the way!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=51352cd6394d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Demystifying the Central Limit Theorem: How Randomness Breeds Normality]]></title>
            <link>https://medium.com/@harshnkgupta/demystifying-the-central-limit-theorem-how-randomness-breeds-normality-2d1a134ec20a?source=rss-8ee61db420f1------2</link>
            <guid isPermaLink="false">https://medium.com/p/2d1a134ec20a</guid>
            <category><![CDATA[central-limit-theorem]]></category>
            <category><![CDATA[probability-distributions]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[statistics]]></category>
            <category><![CDATA[beginners-guide]]></category>
            <dc:creator><![CDATA[Harsh Gupta]]></dc:creator>
            <pubDate>Sun, 05 May 2024 08:03:46 GMT</pubDate>
            <atom:updated>2024-05-05T08:03:46.496Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NZ2MR78PUyYFagIsNPUifA.gif" /><figcaption>Randomness to Normality</figcaption></figure><p>Imagine you run a bakery that makes muffins. The muffins aren’t identical; some come out slightly bigger, some smaller. This variation in size is captured by the muffins’ weight distribution. But what if you want to know the average muffin weight without weighing every single one? That’s where statistics come in, and the <strong>central limit theorem (CLT)</strong> plays a starring role.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/504/1*mtm4SuUZ2qhbQIKtQJhkSg.gif" /></figure><p>The CLT is a fundamental concept in probability and statistics. It tells us that under certain conditions, as the number of random samples you take from a population increases, the distribution of the <strong>sample means</strong> approaches a <strong>normal distribution</strong>, also known as the bell curve.</p><p><strong>Here’s a breakdown of the key ideas:</strong></p><ul><li><strong>Samples vs. Population:</strong> We rarely have data for the entire population (all muffins baked). Instead, we collect samples (a few muffins each day). The CLT is about the distribution of the <strong>average</strong> of these samples.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/331/1*X0tBqThTLAD8CclBk1lCNA.gif" /></figure><ul><li><strong>The Magic of Averaging:</strong> As you take more samples, the randomness in individual measurements tends to cancel out. The sample means get clustered around the true population mean, forming a bell-shaped curve.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*GiFZNo_MCw-_FS73tRbw7w.gif" /></figure><ul><li><strong>Not Limited to Normal Distributions:</strong> The beauty of the CLT is that it applies even if the original population data isn’t normally distributed. Imagine that muffin weights are skewed towards larger sizes. The sample means will still tend towards a normal distribution as the sample size grows.</li></ul><h3><strong>The Intriguing Math Behind the CLT:</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/784/1*ve9NS4yvjPTgN1oUvDh1lw.png" /></figure><p>The CLT can be expressed mathematically, but fret not, we won’t delve into complex equations here. The main idea is that as sample size increases, the distribution of the standardized sample mean, or simply the number of standard deviations that each sample mean deviates from the overall mean, converges towards a standard normal distribution under certain conditions (such as independent and identically distributed samples).</p><h3><strong>Why is the CLT important?</strong></h3><p>The CLT is crucial because it allows us to use the well-understood properties of the normal distribution for various statistical analyses. Here are some real-world applications:</p><ul><li><strong>Opinion Polls:</strong> Suppose you want to gauge public opinion on a new policy. Polling a small sample might not be representative. The CLT assures us that with a large enough sample, the average opinion will likely fall within a predictable range around the true population opinion.</li><li><strong>Quality Control:</strong> Factories monitor product quality by taking random samples. The CLT lets them use statistical methods like confidence intervals to ensure the average product quality meets specifications.</li><li><strong>Scientific Experiments:</strong> Scientists often rely on small samples due to time or cost constraints. The CLT allows them to make inferences about the entire population (e.g., the effectiveness of a drug) based on the sample results.</li><li><a href="https://medium.com/@harshnkgupta/a-comprehensive-guide-to-confidence-intervals-7d913d2a9a9e"><strong>Confidence Intervals</strong></a><strong>:</strong> Imagine a pollster surveying public opinion on a new law. The CLT allows us to construct <a href="https://medium.com/@harshnkgupta/a-comprehensive-guide-to-confidence-intervals-7d913d2a9a9e"><strong>confidence intervals</strong></a>, which estimate the range within which the true population opinion likely falls, based on the sample results. Check out my blog on Confidence Intervals <a href="https://medium.com/@harshnkgupta/a-comprehensive-guide-to-confidence-intervals-7d913d2a9a9e">here.</a></li><li><strong>Hypothesis Testing:</strong> Scientists often conduct experiments with limited sample sizes. The CLT allows them to perform hypothesis tests, statistically evaluating claims about the entire population (e.g., the effectiveness of a new drug) based on the observed sample data.</li><li><strong>Statistical Inferences:</strong> In numerous fields, from quality control in manufacturing to analyzing customer behavior, the CLT allows researchers to draw inferences about entire populations by studying representative samples.</li></ul><h3><strong>Beyond the Basics: Important Considerations</strong></h3><ul><li><strong>Sample Size Matters:</strong> The CLT holds true for <strong>large enough</strong> sample sizes. The exact size depends on the underlying population distribution’s shape. For skewed or highly non-normal populations, larger samples might be necessary for the normal approximation to be reliable.</li><li><strong>CLT and Other Statistics:</strong> The CLT specifically applies to the <strong>means</strong> of random samples. It doesn’t necessarily guarantee a normal distribution for other statistics like the median or variance.</li></ul><h3><strong>The CLT in Action: Real-World Examples</strong></h3><ul><li><strong>A/B Testing:</strong> Companies often use A/B testing to compare website layouts or marketing campaigns. The CLT allows them to determine if the observed differences in user engagement between the two versions are statistically significant or simply due to random chance.</li><li><strong>Sports Analytics:</strong> Baseball teams analyze players’ batting averages, which inherently involve sample means (average number of hits per at-bat). The CLT helps assess the stability of a player’s performance and identify trends.</li></ul><h3><strong>The Final Word: Embracing Randomness</strong></h3><p>The CLT offers a profound insight: randomness, when averaged out through sufficient samples, can lead to predictable patterns described by the normal distribution. This seemingly counterintuitive notion empowers us to make sense of the variability in our world and draw data-driven conclusions. So next time you encounter randomness, remember the CLT — a testament to the power of statistics in unveiling the underlying order hidden within the apparent chaos.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2d1a134ec20a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Intuition behind Transformers: From Robots in Disguise to Revolutionizing AI]]></title>
            <link>https://medium.com/@harshnkgupta/intuition-behind-transformers-from-robots-in-disguise-to-revolutionizing-ai-c2b2bc05284c?source=rss-8ee61db420f1------2</link>
            <guid isPermaLink="false">https://medium.com/p/c2b2bc05284c</guid>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[naturallanguageprocessing]]></category>
            <category><![CDATA[transformers]]></category>
            <category><![CDATA[deep-learning]]></category>
            <category><![CDATA[beginners-guide]]></category>
            <dc:creator><![CDATA[Harsh Gupta]]></dc:creator>
            <pubDate>Sat, 27 Apr 2024 06:29:58 GMT</pubDate>
            <atom:updated>2024-04-27T06:29:58.223Z</atom:updated>
            <content:encoded><![CDATA[<p>Forget the shapeshifting robots; in the realm of Artificial Intelligence (AI), transformers are a different breed altogether. They’re not made of metal, but are powerful algorithms that are revolutionizing how computers process information, especially text and language.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bLk_z2INyLINv8EHaAPdUQ.jpeg" /></figure><p>But what exactly makes transformers so special? How do they work, and why are they such a significant advancement in AI? Buckle up, because we’re diving into the fascinating world of transformer neural networks!</p><h3><strong>Understanding the Language Puzzle:</strong></h3><p>Imagine a child learning a new language. They start by memorizing individual words. But to truly understand language, they need to grasp the relationships between words — how they form sentences, how they flow together to convey meaning. This is what transformers do for AI.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bxkL8VKvKl3ZCMjrka4mZQ.gif" /></figure><p>Traditional AI models were like those children memorizing words. They were good at specific tasks, like translating a single sentence from one language to another. But they struggled with the bigger picture, the context of language. These models often relied on Recurrent Neural Networks (RNNs) which processed information sequentially, word by word. This had limitations, especially when dealing with long sentences or complex relationships between words.</p><h3>Enter the Transformers: Masters of Attention</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vqXPLZsCBN1lc2ncFPfW0A.png" /><figcaption>Transformer Architecture</figcaption></figure><p>Transformers are a new kind of neural network architecture that throws out the old, sequential approach. Instead, they use a concept called “attention.”</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VXhU-VADRQTzE_72GqPxrg.gif" /><figcaption>Transformer’s working</figcaption></figure><p>Imagine a student in a crowded classroom. The student can focus on the teacher’s voice (the relevant information), while filtering out background noise (irrelevant information). Similarly, transformers can pay “attention” to specific parts of an input sequence (a sentence, for example) and analyze how they relate to each other, regardless of their order. This allows them to capture complex relationships and understand the overall meaning much more effectively.</p><h3><strong>The Secret Sauce: Encoder-Decoder Architecture</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bynMlGszpC3uoBBm2pjZvw.gif" /></figure><p>At its core, a transformer is made up of two parts: an encoder and a decoder. The encoder takes the input sequence (like a sentence) and analyzes it using the attention mechanism. It identifies important relationships between words and creates a condensed representation of the meaning.</p><p>Think of it like summarizing a long paragraph into a few key points. This encoded information is then passed to the decoder. The decoder uses the encoded information and its own attention mechanism to generate an output sequence, like a translated sentence or a continuation of the original text.</p><h3><strong>The Benefits of Going Transformer</strong></h3><p>So, why are transformers such a game-changer in AI? Here’s a breakdown of their superpowers:</p><ul><li><strong>Superior Context Understanding:</strong> By focusing on relationships between words, transformers can grasp the nuances of language much better than traditional models. This makes them ideal for tasks like machine translation, text summarization, and sentiment analysis.</li><li><strong>Parallel Processing Powerhouse:</strong> Unlike RNNs, which process information sequentially, transformers can analyze all parts of the input sequence simultaneously. This makes them significantly faster and more efficient for training and performing tasks.</li><li><strong>Versatility Galore:</strong> The core transformer architecture can be adapted to a wide range of tasks beyond language. They can be used for tasks like image recognition, analyzing protein structures, and even generating different creative text formats like poems or code.</li><li><strong>Foundational Models for the Future:</strong> Transformers are the backbone of a new generation of AI models called foundational models. These are large, powerful models trained on massive amounts of data. Because transformers are so versatile and efficient, they can be fine-tuned for a wide range of specific tasks, making them a powerful starting point for developing new AI applications.</li></ul><h3><strong>The Future Powered by Transformers</strong></h3><p>Transformers are still under development, but their impact on AI is undeniable. They’re helping computers process information in a more human-like way, unlocking a new era of possibilities.</p><p>Here are some exciting areas where transformers are making waves:</p><ul><li><strong>Chatbots and Virtual Assistants:</strong> Imagine chatbots that can understand your questions and respond in a natural, nuanced way. Transformers are making this a reality.</li><li><strong>Content Creation Automation:</strong> Transformers can be used to generate different creative text formats, like marketing copy, summaries of news articles, or even scripts.</li><li><strong>Smarter Search Engines:</strong> By understanding the relationships between words and concepts, transformers can revolutionize how search engines understand and respond to your queries.</li></ul><p>The future of AI is increasingly powered by transformers. As they continue to evolve, they hold the potential to bridge the gap between human and machine communication, leading to a more intelligent and interactive world.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c2b2bc05284c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Demystifying the Chatbot: A High-Level Look at LLM Architecture]]></title>
            <link>https://medium.com/@harshnkgupta/demystifying-the-chatbot-a-high-level-look-at-llm-architecture-08c33f87f772?source=rss-8ee61db420f1------2</link>
            <guid isPermaLink="false">https://medium.com/p/08c33f87f772</guid>
            <category><![CDATA[natural-language-processi]]></category>
            <category><![CDATA[chatbots]]></category>
            <category><![CDATA[large-language-models]]></category>
            <category><![CDATA[deep-learning]]></category>
            <dc:creator><![CDATA[Harsh Gupta]]></dc:creator>
            <pubDate>Thu, 04 Apr 2024 08:18:29 GMT</pubDate>
            <atom:updated>2024-04-04T08:18:29.099Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*V8p_byyZzIOIPM6uCcY5Zg.gif" /></figure><p>Imagine a world where chatbots seamlessly understand your questions, respond with insightful answers, and even hold engaging conversations. This captivating future is closer than you think, thanks to the power of Large Language Models (LLMs). But how exactly do we turn these marvels of machine learning into chatty companions? Let’s delve into the key architectural components that bring LLM chatbots to life.</p><p><strong>The Foundation: The LLM Itself</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/447/1*bknGoZUriWYabncNGhUU5Q.gif" /></figure><p>The heart of any LLM chatbot is, unsurprisingly, the LLM itself. This powerhouse ingests massive amounts of text data, allowing it to grasp the intricacies of human language. It learns the relationships between words, sentence structures, and even conversational flow. When you ask a question, the LLM leverages this knowledge to predict the most fitting response.</p><p><strong>The Interpreter: Understanding Your Input</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*wSh2axQqhlDktNx9oVEY7g.gif" /></figure><p>But LLMs don’t magically understand your every nuance. We need a component to bridge the gap between your natural language and the LLM’s internal processing. This is where the <strong>Natural Language Understanding (NLU)</strong> module comes in. It analyzes your message, identifies the intent behind your words (are you asking a question, making a request, or simply chatting?), and extracts relevant information. Essentially, the NLU preps your message for the LLM to make sense of it.</p><p><strong>The Formulator: Crafting the Response</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*hmDr_rlM_TgaIJjAxyiPKw.gif" /></figure><p>Once the LLM comprehends your intent, it’s time to craft a response. This is where the <strong>Natural Language Generation (NLG)</strong> module takes center stage. It utilizes the LLM’s output and translates it back into human-readable language. The NLG strives to generate a response that is not only informative but also stylistically appropriate, considering the context of the conversation.</p><p><strong>The Memory Keeper: Maintaining Context</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yHIo0FtsCrzc_7PBCMRgBA.gif" /></figure><p>Imagine a conversation where you abruptly switch topics. A human would easily keep track, but an LLM chatbot might struggle without a <strong>dialogue history module</strong>. This component stores the conversation flow, allowing the LLM to reference past interactions and provide responses that are consistent with the context.</p><p><strong>The Orchestrator: Putting it All Together</strong></p><p>Finally, we need a maestro to conduct this symphony of components. The <strong>Dialogue Manager</strong> takes the reins, coordinating the flow of information between the NLU, LLM, NLG, and dialogue history modules. It ensures a smooth conversation by determining what information needs to be processed by the LLM, presenting the results to the NLG for response generation, and updating the dialogue history for future reference.</p><p><strong>A Glimpse into the Future</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fzZOloVd_DKNc7fE5jJEkA.gif" /></figure><p>Building LLM chatbots is an evolving field. Researchers are constantly exploring ways to improve NLU and NLG accuracy, enhance dialogue management strategies, and incorporate additional functionalities like sentiment analysis. As these advancements continue, we can expect LLM chatbots to become even more sophisticated conversational partners, blurring the lines between human and machine interaction.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=08c33f87f772" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A Comprehensive Guide to Confidence Intervals]]></title>
            <link>https://medium.com/@harshnkgupta/a-comprehensive-guide-to-confidence-intervals-7d913d2a9a9e?source=rss-8ee61db420f1------2</link>
            <guid isPermaLink="false">https://medium.com/p/7d913d2a9a9e</guid>
            <category><![CDATA[statistics]]></category>
            <category><![CDATA[probability]]></category>
            <category><![CDATA[intuition]]></category>
            <category><![CDATA[confidence-interval]]></category>
            <category><![CDATA[machine-learning]]></category>
            <dc:creator><![CDATA[Harsh Gupta]]></dc:creator>
            <pubDate>Sun, 31 Mar 2024 13:51:23 GMT</pubDate>
            <atom:updated>2024-03-31T13:51:23.624Z</atom:updated>
            <content:encoded><![CDATA[<p>In the realm of statistics, peering into the characteristics of a vast population often requires a closer look at a smaller, manageable group. This subset, known as a <strong>sample</strong>, serves as a window into the larger world we’re interested in — like a single scoop of ice cream revealing the flavor of the entire tub. But just like that first spoonful might not capture every single chocolate chip, there’s always an inherent level of uncertainty when using a sample to represent an entire population.</p><p>This is where the concept of <strong>confidence intervals</strong> emerges, acting as a statistical spotlight to illuminate the range where the true population value likely resides. Imagine you want to understand the average sleep duration for adults in your country. Surveying everyone would be ideal, but practically impossible. So, you collect data from a representative sample of, say, 1000 adults. Their average sleep duration becomes your <strong>point estimate</strong>, a single value that summarizes your sample. However, there’s always a chance this estimate might differ slightly from the true average sleep duration of the entire adult population.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/552/1*5y1PKD6VCDXenqmKqH-CMg.png" /><figcaption>Confidence Intervals</figcaption></figure><p>Confidence intervals come to the rescue by acknowledging this uncertainty and providing a more nuanced picture. They essentially create a <strong>range of values</strong> around the point estimate, indicating the probability that the true population parameter (average sleep duration in our example) falls within that range. Think of it like an archery target: the point estimate is the bullseye you’re aiming for, and the confidence interval is the surrounding area where you’re highly confident the true value lies.</p><p>Let’s delve deeper into the key elements that construct a confidence interval:</p><p><strong>Populations vs. Samples: Understanding the Duality</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/331/1*X0tBqThTLAD8CclBk1lCNA.gif" /></figure><ul><li><strong>Population:</strong> This represents the entire collection of individuals or items we’re interested in studying (all the adults in your country). It’s the vast and often impractical group we cannot directly measure in its entirety.</li><li><strong>Sample:</strong> This is a smaller subset chosen from the population that acts as a representative for the whole (the 1000 adults you surveyed). The quality of our inferences depends heavily on how well this sample reflects the characteristics of the larger population.</li></ul><p><strong>Point Estimates vs. Confidence Intervals: From a Single Value to a Range of Possibilities</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/710/1*VAdz4fJsOAqrNbADH_ge7Q.png" /></figure><ul><li><strong>Point Estimate:</strong> This is a single number calculated from your sample data that serves as your best guess for an unknown population parameter. In our sleep study, it would be the average sleep duration you obtain from your 1000 participants.</li><li><strong>Confidence Interval:</strong> This is the magic happening around the point estimate. It’s a range of values constructed to capture the true population parameter with a certain level of confidence (usually expressed as a percentage). A wider confidence interval indicates greater uncertainty, while a narrower interval signifies higher precision in your estimate.</li></ul><p><strong>Building the Confidence Interval: The Nuts and Bolts</strong></p><p>There are two key ingredients that determine the shape and size of your confidence interval:</p><ol><li><strong>Confidence Level:</strong> This reflects the probability (typically 90%, 95%, or 99%) that the confidence interval captures the true population parameter. Imagine tossing a fair coin 100 times. A 95% confidence level means you’re expecting the number of heads to fall within a specific range in 95 out of those 100 tosses. Similarly, a 95% confidence interval indicates you’re 95% certain the true population value lies within the calculated range. Choosing a higher confidence level expands the interval to encompass a wider range of values, but with greater certainty. Conversely, a lower confidence level results in a narrower interval but with less certainty of capturing the true value.</li><li><strong>Margin of Error:</strong> This reflects the amount of uncertainty or potential deviation around the point estimate. It’s kind of like the “wiggle room” in your archery target — the smaller the margin of error, the tighter your bullseye (confidence interval) is around the true value. The margin of error is calculated by considering the sample size and the chosen confidence level. A larger sample size typically leads to a smaller margin of error, and consequently, a narrower confidence interval. This is because a larger sample provides more information and a more accurate picture of the population.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/799/1*LNAz1VMYIVvv_KoRGL_EKw.png" /></figure><p><strong>Assumptions for Confidence Intervals: The Foundation for Trustworthy Results</strong></p><p>To ensure the validity of your confidence interval, it’s crucial to consider these underlying assumptions:</p><ol><li><strong>Random Sampling:</strong> Your sample should be a fair and unbiased representation of the population. This means every member of the population has an equal chance of being selected. Imagine a lottery where everyone’s name goes into a hat, and you blindly pick the sample. Random sampling techniques help to mitigate biases and ensure the results can be reliably generalized to the entire population.</li><li><strong>Normal Distribution (or Large Sample Size):</strong> Ideally, the data in the population follows a normal distribution, also known as a bell-shaped curve. This symmetrical distribution ensures there’s an equal probability of values falling above or below the average. If the population data is significantly skewed or has outliers, alternative methods might be necessary. However, the Central Limit Theorem comes to the rescue in many cases. This theorem states that as your sample size increases (usually n ≥ 30), the sampling distribution of the mean (the average of your samples) approaches normality regardless of the original population distribution. In simpler terms, even if the population data isn’t perfectly normal, a large enough sample size can still justify using the standard confidence interval procedures.</li><li><strong>Independent Observations:</strong> The data points within your sample should be independent of each other. This means the value of one observation shouldn’t influence the value of another. For instance, if you’re measuring the weight of apples on a tree, each apple’s weight should be independent of the others. This assumption becomes particularly important when dealing with time series data or data with inherent dependencies.</li></ol><p><strong>Interpreting Confidence Intervals: Extracting Meaning from the Range</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/587/1*5FUHEzAzCiEbreET0lKDrw.png" /></figure><p>Imagine you constructed a 95% confidence interval for the average sleep duration in your study, ranging from 7.5 hours to 8.2 hours. You can interpret this as: “We are 95% confident that the true average sleep duration for all adults in our country falls within the range of 7.5 hours to 8.2 hours.” This statement reflects the uncertainty inherent in using samples but also provides valuable insights. If your study aims to determine if adults get enough sleep based on health recommendations, the confidence interval can guide your conclusions.</p><p><strong>Confidence Interval (Sigma Known) VS Confidence Interval (Sigma Not Known): Navigating Different Scenarios</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/841/1*Dm8lCnqJauyf1QdwhwpHAQ.png" /><figcaption>For Std known</figcaption></figure><ul><li><strong>Confidence Interval (Sigma Known):</strong> In an ideal scenario, you might know the population standard deviation from prior studies or extensive data on the population. If this is the case, you can leverage the z-distribution to construct your confidence interval. The z-distribution is a standard normal distribution with a mean of zero and a standard deviation of one. This approach generally results in narrower confidence intervals, reflecting the advantage of having more information about the population’s variability.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/272/1*JKDdmVTh-FxspYM1rfG2Xg.jpeg" /><figcaption>For Std Unknown</figcaption></figure><ul><li><strong>Confidence Interval (Sigma Not Known):</strong> In most real-world situations, the population standard deviation is unknown. However, all is not lost! We can estimate the population standard deviation by calculating the sample standard deviation (s) from our sample data. Since we’re using an estimate instead of the actual population standard deviation, we employ the t-distribution to construct the confidence interval. The t-distribution is similar to the z-distribution but incorporates an additional parameter called the degrees of freedom (related to the sample size). This adjustment accounts for the uncertainty introduced by using an estimate. As a consequence, confidence intervals constructed using the t-distribution tend to be wider compared to those using the z-distribution, reflecting the additional uncertainty.</li></ul><p><strong>Key Takeaways: Confidence Intervals — A Powerful Tool in the Statistical Arsenal</strong></p><p>Confidence intervals are a cornerstone of statistical inference, allowing researchers and data analysts to move beyond point estimates and acknowledge the inherent limitations of samples. Here’s a quick recap of the key takeaways:</p><ul><li>Confidence intervals provide a range of plausible values for a population parameter based on sample data.</li><li>The width of the interval reflects the uncertainty associated with the estimate. A wider interval indicates more uncertainty, while a narrower interval signifies higher precision.</li><li>The chosen confidence level and sample size play a crucial role in determining the width of the interval. Higher confidence levels or smaller sample sizes lead to wider intervals.</li><li>Understanding confidence intervals allows for a more nuanced interpretation of statistical results and facilitates data-driven decision making.</li></ul><p><strong>In conclusion, confidence intervals are not about pinpointing a single exact value, but rather about illuminating a range of possibilities with a defined level of certainty. By embracing the inherent uncertainty in sampling, confidence intervals empower us to make informed inferences about the world around us.</strong></p><p><strong>P.S.</strong> Try out Confidence Interval Visualizations <a href="https://rpsychologist.com/d3/ci/">here</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7d913d2a9a9e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Intuition Behind Linear Transformations]]></title>
            <link>https://medium.com/@harshnkgupta/intuition-behind-linear-transformations-22cb4cda8224?source=rss-8ee61db420f1------2</link>
            <guid isPermaLink="false">https://medium.com/p/22cb4cda8224</guid>
            <category><![CDATA[linear-algebra]]></category>
            <category><![CDATA[beginner]]></category>
            <category><![CDATA[matrix]]></category>
            <category><![CDATA[linear-transformation]]></category>
            <dc:creator><![CDATA[Harsh Gupta]]></dc:creator>
            <pubDate>Thu, 28 Mar 2024 11:38:17 GMT</pubDate>
            <atom:updated>2024-03-28T11:38:17.290Z</atom:updated>
            <content:encoded><![CDATA[<p>Hey there! Linear transformations… sometimes they fly right over our heads in that first linear algebra course, right? Don’t worry, that’s totally normal. But fear not, because today we’re going to crack the code on linear transformations and see how they connect to those mysterious things called matrices. We’re going to ditch the super technical stuff for a minute and focus on building an intuition for what these things actually do. So buckle up, and let’s dive into the magical world of transformations!</p><p><strong>Imagine You Have a Superpower… to Move Things Around!</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/320/1*1n9JUO9htkpAnfIqPE1-sw.gif" /></figure><p>Think of a linear transformation like a superpower that lets you move stuff around in space. You can take any vector (which is basically an arrow with a direction and a strength) and zap it somewhere else. But here’s the twist: this superpower has some rules.</p><p><strong>The Rules of the Transformation Game</strong></p><ul><li><strong>Straight Lines Stay Straight:</strong> No matter what cool moves your transformation does, it can’t turn straight lines into curvy lines. Lines gotta stay lines!</li><li><strong>The Origin Stays Put:</strong> The origin (that special point where all the axes meet) is like your home base. Your transformation can’t move it — it has to stay rooted in its spot.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UPyH5lvTreWlVi9KhSqerg.png" /></figure><p>Imagine a grid of lines, nice and straight. A linear transformation can stretch it, shrink it, or even rotate it all around, but those lines will stay stubbornly straight, and the origin will stay right in the center of it all.</p><p><strong>Why Do We Call It a Transformation Anyway?</strong></p><p>That fancy word “transformation” might seem like overkill for just moving things around. But here’s the thing: a transformation doesn’t just move stuff — it can also change its shape! A linear transformation, however, plays by the rules we talked about earlier. It can’t create curves or bends, so it keeps things nice and orderly.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/320/1*hxSduunKvQEdL3H8rn8IKA.gif" /><figcaption>Lines remains lines , no curves.</figcaption></figure><p><strong>Seeing is Believing: From Arrows to Points</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*81YyjkzsPs6PqTWq_btcTg.gif" /></figure><p>Visualizing transformations with arrows can be a bit overwhelming, especially when things get complex. So, here’s a neat trick: instead of focusing on the entire arrow, let’s just think about the tip of the arrow, the point where it lands. This way, we can track how a whole grid of points gets transformed.</p><p><strong>Matrices: The Secret Code of Transformations</strong></p><p>Now that we understand how linear transformations move things around, let’s crack the code for describing them mathematically. Here’s where matrices come in! In the two-dimensional world (think of a flat plane), a linear transformation can be completely described by just four numbers. These numbers tell us where two special arrows, called basis vectors (i-hat and j-hat), land after the transformation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/320/1*0GKWdhfDYJw99ezC_tCToQ.gif" /></figure><p>Imagine a special codebook where these four numbers are written in a specific arrangement — a 2x2 grid. This grid is called a matrix, and it basically holds the secret recipe for your transformation. By looking at this matrix, we can understand exactly how the transformation will move any vector around.</p><p><strong>Multiplying Your Way to Transformed Vectors</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/857/1*HCKLKLOm5clIeG-d0cRLhA.gif" /></figure><p>So, how do we use this matrix to actually transform a vector? Here’s where something called matrix multiplication comes in. It might sound scary, but it’s actually a pretty straightforward process. By multiplying the matrix with the coordinates of your vector, you basically follow the instructions encoded in the matrix and calculate where the vector ends up after the transformation!</p><p><strong>The Fun Part: Bringing Transformations to Life!</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/320/1*6pYamntyKOy1MgBLhzCiGg.gif" /></figure><p>Linear transformations can be as simple as a good old-fashioned rotation (like turning a clock hand) or a bit more exotic, like a shear (imagine stretching a rectangle in one direction). By understanding matrices as the secret code for transformations, we can easily describe and visualize these cool effects.</p><p><strong>The Takeaway: Transformations Rule!</strong></p><p>Remember this golden nugget: every matrix you come across is basically a secret message for a specific linear transformation. Once you grasp this idea, you’ll be well on your way to unlocking the mysteries of linear algebra. From multiplying matrices to figuring out determinants, change of basis, and even eigenvalues, these concepts will all start to click into place when you see them through the lens of transformations.</p><p><strong>So, the next time you hear about linear transformations, don’t just think about equations and formulas. Imagine yourself as a superhero with the power to move things around in space, but with a twist — you have to keep things neat and orderly. Matrices are then your secret codebook, telling you exactly how to use your powers!</strong></p><p><strong>Embrace the power of transformations! By understanding their visual essence and connection to matrices, you’ll unlock a deeper appreciation for this fundamental concept in linear algebra. Now go forth and transform the world (or at least your understanding of linear algebra) with your newfound knowledge!</strong></p><p><strong>P.S.</strong> Want to practice your newfound transformation skills? Try playing around with some online tools <a href="https://www.geogebra.org/m/YCZa8TAH">(like Geogebra)</a> that let you visualize linear transformations in action. See how stretching, shrinking, rotating, and shearing the grid affects the overall transformation. With a little practice, you’ll be a linear transformation whiz in no time!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=22cb4cda8224" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>