Name: Towards AI Legal Name: Towards AI, Inc. Description: Towards AI is the world's leading artificial intelligence (AI) and technology publication. Read by thought-leaders and decision-makers around the world. Phone Number: +1-650-246-9381 Email: pub@towardsai.net
228 Park Avenue South New York, NY 10003 United States
Website: Publisher: https://towardsai.net/#publisher Diversity Policy: https://towardsai.net/about Ethics Policy: https://towardsai.net/about Masthead: https://towardsai.net/about
Name: Towards AI Legal Name: Towards AI, Inc. Description: Towards AI is the world's leading artificial intelligence (AI) and technology publication. Founders: Roberto Iriondo, , Job Title: Co-founder and Advisor Works for: Towards AI, Inc. Follow Roberto: X, LinkedIn, GitHub, Google Scholar, Towards AI Profile, Medium, ML@CMU, FreeCodeCamp, Crunchbase, Bloomberg, Roberto Iriondo, Generative AI Lab, Generative AI Lab Denis Piffaretti, Job Title: Co-founder Works for: Towards AI, Inc. Louie Peters, Job Title: Co-founder Works for: Towards AI, Inc. Louis-François Bouchard, Job Title: Co-founder Works for: Towards AI, Inc. Cover:
Towards AI Cover
Logo:
Towards AI Logo
Areas Served: Worldwide Alternate Name: Towards AI, Inc. Alternate Name: Towards AI Co. Alternate Name: towards ai Alternate Name: towardsai Alternate Name: towards.ai Alternate Name: tai Alternate Name: toward ai Alternate Name: toward.ai Alternate Name: Towards AI, Inc. Alternate Name: towardsai.net Alternate Name: pub.towardsai.net
5 stars – based on 497 reviews

Frequently Used, Contextual References

TODO: Remember to copy unique IDs whenever it needs used. i.e., URL: 304b2e42315e

Resources

Take our 85+ lesson From Beginner to Advanced LLM Developer Certification: From choosing a project to deploying a working product this is the most comprehensive and practical LLM course out there!

Publication

In Homage to Benoit Mandelbrot
Data Visualization   Mathematics   Programming

In Homage to Benoit Mandelbrot

Last Updated on December 23, 2020 by Editorial Team

Author(s): Jonathan Scott

Image by the author. 

Brownian Motion in Multifractal Time

I must thank my good friend Daniel Luftspring for his contributions and guidance throughout the development of this project.

Short on the Assessment of Risk

At the core of the financial market theory, there is a large and unstable assumption. The assumption is that the risk of a financial instrument can be determined by its volatility and that this measure scales with the square root of time. To understand the origins of this assumption, you must travel back before the subprime mortgage crisis of 2008, the dot-com bubble of 2000, Black Monday in 1987, the Wall Street Crash of 1929, and then another one hundred years. Here, you will find Robert Brown looking through a microscope at a speck of pollen suspended in water. He observed that the speck danced erratically. In 1900, this observation was applied to finance with advanced mathematics by Louis Bachelier in his dissertation, Théorie de la spéculation, on modeling the stock market. With the assumption that the price of a stock moved in the same random manner as the speck of pollen, he was able to calculate a price for the stock’s option. In 1905, Albert Einstein studied the same process and provided a way to mathematically describe the movement of the particle. Einstein proved that the movement was attributed to the individual water molecules bombarding the speck of pollen. Additionally, he provided mathematics to show that the distance the speck travels from its origin scales at the square root of the time that has elapsed. In honor of Robert Brown, a process which moves in a statistically similar way to the speck of pollen is called Brownian motion.

To this day, financial market theory is based on the work provided by Bachelier and Einstein in the early 1900s. The distance the speck of pollen travels is comparable to the volatility of a financial asset, wherein the price range from the minimal value to the maximum value of a mean adjusted cumulative deviation series within a given length of time should scale with the square root of the length of that time period. In other words, the longer the time period, the larger the expected price range. A proper assessment of risk is necessary, as it is the basis for valuing financial assets and constructing efficient portfolios.

A Brownian motion’s movement is described by a Standard Normal Distribution. This famous distribution conveniently describes many complex systems. Therefore, it is understandable that Bachelier would assume the stock market could be described by this distribution. This is, however, a misclassification. Einstein proved the distance a Brownian motion process travels from its origin scales at the square root of time; however, it is commonly shown that a stock market’s variability will scale faster than the square root of time. Edgar E. Peters provides excellent empirical evidence of the true scaling rate in Fractal Market Analysis. This is to say that the market is more volatile than a Brownian motion suggests. Volatility has long been considered the essence of risk, and without a proper assessment of risk, financial instruments cannot be valued properly and investors will be blindsided by ruinous events in the market.

It is much like a theory of sea waves that forbids their swells to exceed six feet.
– Mandelbrot, Benoit. How Fractals Can Explain What’s Wrong with Wall Street.

Benoit B. Mandelbrot

Benoit Mandelbrot recognized the flaws of financial market theory models and attempted to provide an alternative — one which more accurately assessed risk. The model would generate a realistic time series with large swings in price and clusters of volatility. These were not accounted for by existing models.

Mandelbrot’s contributions to the mathematical community are vast and impactful, but perhaps his most notable contribution is his work on fractal geometry. A fractal, which is more formally described in the next sections, has a common characteristic: the structure is random locally and deterministic globally. Edgar E. Peters provides the example in Fractal Market Analysis of mammalian lung bronchi. The branching of bronchi at a microscopic level is random, but the global structure of the lungs is almost always deterministic. Similarly, the micro-movements of a stock appear random within short spans of time, but there is a more deterministic structure globally. Mandelbrot believed a simple fractal shape could explain the complex structure of the market. With apologies to him and his colleagues, this article attempts to describe his greatest method for emulating a financial market: Brownian Motion in Multifractal Time.

A Fractured Market

A fractal is a geometric shape that can be separated into parts, each of which is a reduced-scale version of the whole.
– Mandelbrot, Benoit. Scaling in Financial Prices: III. Cartoon Brownian motions in multifractal time.

Upon observing that the market looks similar at all scales, he was confident that a proper fractal could simulate the market and capture its key attributes: large swings and clustered volatility.

Fractal Price Generator

Figure 1: Initiator and Generator of the financial fractal

The root of a fractal is an initiator and a generator. In the case of Mandelbrot’s financial fractal, which is represented in Figure 1, the initiator is a straight line representing the price change, and the generator is a lightning bolt shape with two turning points and proceeds in an up-down-up fashion. The up-down-up procession allows for the up and down periods in the market. Each of the three straight line segments of the generator becomes the next iteration of initiators. Through infinite iteration, the fractal builds. Figure 2 iterates this process four times.

Figure 2: Iterating a fractal price generator four times

The model can be extended by randomizing each of the three segments of the generator as shown in Figure 3.

Figure 3: Randomizing segments of the fractal price generator

There is special generator for a Brownian motion process — the process from which financial theory builds. It is symmetric with the first turning point at y=2/3 and x=4/9. Iterate the Brownian motion generator such that each of the three segments is the same proportional width and height and the process will always be Brownian motion. Iterating the Brownian motion generator creates a visually realistic picture of the market, as seen in Figure 4.

Figure 4: Brownian motion time series

This is a pretty picture which may pass a visual test, but the statistical properties of the Brownian motion generator are starkly different than that of a true market. It is often easier to look at the price differences between moments than the price chart when determining the fitness of the model. For example, Figure 4 passes the visual test of what a market’s price chart looks like, but it is visually clear that its moment to moment price changes, as represented in Figure 5, do not represent that of a true market (see Figure 6). The moment to moment price changes of the Brownian motion, represented in Figure 5, spread uniformly throughout time and the amplitude of very few changes fall out of the norm.

Figure 5: Brownian motion (white noise) volatility

A true market’s moment to moment price changes will look like Figure 6. This figure displays clusters of volatility, unlike the uniform volatility in Figure 5. In Figure 6 it is more likely for a large change to be followed by more large changes, and for a small change to be followed by more small changes. Mandelbrot calls this long term dependence. Long term dependence is found in a true market and not within a Brownian Motion modeled market.

Figure 6: Clustered volatility of a true market

However, the Brownian motion generator can be altered to produce a realistic chart like Figure 6. This will be discussed in the following section.

Brownian Motion in Multifractal Time

Mandelbrot showed that fractals are versatile enough to accurately emulate the Brownian motion market, which is the basis of financial market theory. He adapts the Brownian motion, which is considered unifractal, to be a multifractal price generator, as described below. Such an adaptation is required to produce the large swings and clusters of volatility.

Multifractal Price Generator

It is commonly assumed that there are faster and slower periods of market activity. The Brownian motion generator can be altered to account for these fast and slow periods of time, which Mandelbrot states is the essence of volatility.

Figure 7: Converting a unifractal to multifractal (exaggerated for detail)

Each stage of the iteration starts with a Brownian motion generator (unifractal), and then contracts or lengthens each segment, as shown in Figure 7, in a prescribed way. The resulting generator is considered to be multifractal. The price (y coordinate) of the turning points remains the same, but the time (x coordinate) taken to reach that price changes. Since market activity is represented by the change in y, Figure 7 shows that the same amount of market activity occurs in a shorter amount of time for segments one and three, and a longer amount of time in segment two.

Figure 8 displays that the moment to moment price change chart of a multifractal generator has large swings and clusters of volatility.

Figure 8: Clustered volatility with a multifractal price generator

The question arises, in what prescribed way should the Brownian motion unifractal price generator be altered so that it becomes multifractal and produces a realistic time series?

Clock Time vs Trading Time

Clock Time can be represented as a straight line — it progresses at the same rate, always. Markets, however, observe fast and slow periods of time, as though they follow some derivative of Clock Time. Mandelbrot coins this process Trading Time, and Trading Time does not progress linearly. Figure 9 displays Clock Time (straight line) transforming into Trading Time.

Figure 9: Clock Time and Trading Time

Mandelbrot believes that Trading Time progresses in a multifractal manner. The binomial multiplicative cascade, which is described below, is used to transform Clock Time into Trading Time, as it is known to be multifractal.

The binomial multiplicative cascade is a fractal. The initiator is a horizontal line, and the generator is a step function placed upon that horizontal line. To create the cascade, start by representing Clock Time as the initiator and define two weights that sum to one. For every initiator of Clock Time, bifurcate that initiator and allocate weight 1 to the area under the first half and weight 2 to the area under the second half. The total area under the initiator is maintained as the total area under the generator. One iteration of this process is shown in Figure 10.

Figure 10: Binomial Multiplicative Cascade with weight 1 = 0.6

In the Figure 10, the area under the initiator is base x height = area, or 1 x 1 = 1. Weight 1 is selected as 0.6 and weight 2 as 0.4. After one iteration, weight 1 of the total area under the initiator is assigned to the first half of the generator. Likewise, weight 2 of the total area under the initiator is assigned to the second half of the generator. This produces two rectangles with width 0.5 and an unknown height. The equation for the first rectangle is 0.5 x height = 0.6, since bifurcating the initiator provides a known base and weight 1 determines that the area of rectangle 1 is 0.6. Solving for height produces 1.2. The same process is applied for rectangle 2. The area of 1 under the original initiator is maintained and calculated as the cumulative area of the generator’s two rectangles: (1.2 x 0.5) + (0.8 x 0.5) = 1. Figure 11 iterates the process four times.

Figure 11: Binomial Cascade iterating four times

Randomizing the allocation of weights at each stage of the iteration and iterating many times produces the multiplicative cascade. As described above, the total area under the multiplicative cascade is equivalent to the total area under the original initiator. Therefore, the multiplicative cascade is a Probability Density Function (“PDF”) by construction. An example is shown in Figure 12.

Figure 12: Trading Time PDF

The last step of converting Clock Time to Trading Time is to calculate the Cumulative Density Function (“CDF”) of the multiplicative cascade PDF. Figure 13 shows the Trading Time CDF.

Figure 13: Clock Time and Trading Time

Trading Time’s Effect on Brownian Motion

Trading Time transforms the Brownian motion generator into a multifractal price generator. The process is best illustrated in Figure 14 with three graphs: the Brownian motion generator, Trading Time, and the resulting multifractal generator.

Figure 14: Transforming the Brownian motion generator with Trading Time

Figure 14 visualizes the transformation of the turning points of a Brownian motion generator (unifractal) into new turning points of the Brownian Motion in Multifractal Time generator (multifractal). Figure 14 is read from the turning points of the Brownian motion generator in the upper right quadrant, down to the Trading Time CDF in the lower right quadrant, and then over to the left and up to the new turning points of the multifractal generator. As shown in Figure 14, the Trading Time CDF is evaluated at each turning point of the Brownian motion generator. The difference in height between sequential turning points when projected onto the CDF (purple lines), becomes the width (red lines) of the corresponding multifractal generator segment. After the transformation, the width of each of the three segments of the Brownian motion generator has been altered by Trading Time. This alteration changes the length of time in which each segment’s market activity occurs. Since Trading Time is multifractal, the resulting generator is a Brownian motion that progresses in Multifractal Time.

Note:
I am hard pressed to find information that describes the exact process which ensures the new sum of the width values generated by the CDF maintain the sum of width values of the Brownian motion generator. I chose to follow this process.

Figure 14 is exaggerated for effect, and the CDF is only constructed with one iteration. In reality, the CDF is fully formed through many iterations of the binomial cascade before the first iteration through the fractal price generator. At each iteration of the fractal price generator, the CDF is evaluated to adjust the x coordinates of each turning point of the fractal price generator. This process transforms the unifractal price generator into a multifractal price generator. The resulting time series contains both large swings and clusters of volatility as shown in Figure 15 and Figure 16.

Figure 15: Brownian Motion in Multifractal Time time series
Figure 16: Brownian Motion in Multifractal Time volatility clusters

Figures 15 and 16 complete Benoit Mandelbrot’s Brownian Motion in Multifractal Time model. This model explains the complex structure of the market better than common financial market theory, and consequently provides a better assessment of market risk.

Concluding Remarks

The information provided in this article is a summary of Brownian Motion in Multifractal Time. It attempts to explain concepts from Mandelbrot’s publications in a simplified way. For more information about Brownian Motion in Multifractal Time, I encourage you to visit four sources which formed my knowledge base for this article:

To construct a time series, visit this interactive site. If you are interested in the code which generates these time series, install the python package fractalmarkets and follow instructions on Github.


In Homage to Benoit Mandelbrot was originally published in Towards AI on Medium, where people are continuing the conversation by highlighting and responding to this story.

Published via Towards AI

Feedback ↓

Sign Up for the Course
`; } else { console.error('Element with id="subscribe" not found within the page with class "home".'); } } }); // Remove duplicate text from articles /* Backup: 09/11/24 function removeDuplicateText() { const elements = document.querySelectorAll('h1, h2, h3, h4, h5, strong'); // Select the desired elements const seenTexts = new Set(); // A set to keep track of seen texts const tagCounters = {}; // Object to track instances of each tag elements.forEach(el => { const tagName = el.tagName.toLowerCase(); // Get the tag name (e.g., 'h1', 'h2', etc.) // Initialize a counter for each tag if not already done if (!tagCounters[tagName]) { tagCounters[tagName] = 0; } // Only process the first 10 elements of each tag type if (tagCounters[tagName] >= 2) { return; // Skip if the number of elements exceeds 10 } const text = el.textContent.trim(); // Get the text content const words = text.split(/\s+/); // Split the text into words if (words.length >= 4) { // Ensure at least 4 words const significantPart = words.slice(0, 5).join(' '); // Get first 5 words for matching // Check if the text (not the tag) has been seen before if (seenTexts.has(significantPart)) { // console.log('Duplicate found, removing:', el); // Log duplicate el.remove(); // Remove duplicate element } else { seenTexts.add(significantPart); // Add the text to the set } } tagCounters[tagName]++; // Increment the counter for this tag }); } removeDuplicateText(); */ // Remove duplicate text from articles function removeDuplicateText() { const elements = document.querySelectorAll('h1, h2, h3, h4, h5, strong'); // Select the desired elements const seenTexts = new Set(); // A set to keep track of seen texts const tagCounters = {}; // Object to track instances of each tag // List of classes to be excluded const excludedClasses = ['medium-author', 'post-widget-title']; elements.forEach(el => { // Skip elements with any of the excluded classes if (excludedClasses.some(cls => el.classList.contains(cls))) { return; // Skip this element if it has any of the excluded classes } const tagName = el.tagName.toLowerCase(); // Get the tag name (e.g., 'h1', 'h2', etc.) // Initialize a counter for each tag if not already done if (!tagCounters[tagName]) { tagCounters[tagName] = 0; } // Only process the first 10 elements of each tag type if (tagCounters[tagName] >= 10) { return; // Skip if the number of elements exceeds 10 } const text = el.textContent.trim(); // Get the text content const words = text.split(/\s+/); // Split the text into words if (words.length >= 4) { // Ensure at least 4 words const significantPart = words.slice(0, 5).join(' '); // Get first 5 words for matching // Check if the text (not the tag) has been seen before if (seenTexts.has(significantPart)) { // console.log('Duplicate found, removing:', el); // Log duplicate el.remove(); // Remove duplicate element } else { seenTexts.add(significantPart); // Add the text to the set } } tagCounters[tagName]++; // Increment the counter for this tag }); } removeDuplicateText(); //Remove unnecessary text in blog excerpts document.querySelectorAll('.blog p').forEach(function(paragraph) { // Replace the unwanted text pattern for each paragraph paragraph.innerHTML = paragraph.innerHTML .replace(/Author\(s\): [\w\s]+ Originally published on Towards AI\.?/g, '') // Removes 'Author(s): XYZ Originally published on Towards AI' .replace(/This member-only story is on us\. Upgrade to access all of Medium\./g, ''); // Removes 'This member-only story...' }); //Load ionic icons and cache them if ('localStorage' in window && window['localStorage'] !== null) { const cssLink = 'https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css'; const storedCss = localStorage.getItem('ionicons'); if (storedCss) { loadCSS(storedCss); } else { fetch(cssLink).then(response => response.text()).then(css => { localStorage.setItem('ionicons', css); loadCSS(css); }); } } function loadCSS(css) { const style = document.createElement('style'); style.innerHTML = css; document.head.appendChild(style); } //Remove elements from imported content automatically function removeStrongFromHeadings() { const elements = document.querySelectorAll('h1, h2, h3, h4, h5, h6, span'); elements.forEach(el => { const strongTags = el.querySelectorAll('strong'); strongTags.forEach(strongTag => { while (strongTag.firstChild) { strongTag.parentNode.insertBefore(strongTag.firstChild, strongTag); } strongTag.remove(); }); }); } removeStrongFromHeadings(); "use strict"; window.onload = () => { /* //This is an object for each category of subjects and in that there are kewords and link to the keywods let keywordsAndLinks = { //you can add more categories and define their keywords and add a link ds: { keywords: [ //you can add more keywords here they are detected and replaced with achor tag automatically 'data science', 'Data science', 'Data Science', 'data Science', 'DATA SCIENCE', ], //we will replace the linktext with the keyword later on in the code //you can easily change links for each category here //(include class="ml-link" and linktext) link: 'linktext', }, ml: { keywords: [ //Add more keywords 'machine learning', 'Machine learning', 'Machine Learning', 'machine Learning', 'MACHINE LEARNING', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, ai: { keywords: [ 'artificial intelligence', 'Artificial intelligence', 'Artificial Intelligence', 'artificial Intelligence', 'ARTIFICIAL INTELLIGENCE', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, nl: { keywords: [ 'NLP', 'nlp', 'natural language processing', 'Natural Language Processing', 'NATURAL LANGUAGE PROCESSING', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, des: { keywords: [ 'data engineering services', 'Data Engineering Services', 'DATA ENGINEERING SERVICES', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, td: { keywords: [ 'training data', 'Training Data', 'training Data', 'TRAINING DATA', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, ias: { keywords: [ 'image annotation services', 'Image annotation services', 'image Annotation services', 'image annotation Services', 'Image Annotation Services', 'IMAGE ANNOTATION SERVICES', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, l: { keywords: [ 'labeling', 'labelling', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, pbp: { keywords: [ 'previous blog posts', 'previous blog post', 'latest', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, mlc: { keywords: [ 'machine learning course', 'machine learning class', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, }; //Articles to skip let articleIdsToSkip = ['post-2651', 'post-3414', 'post-3540']; //keyword with its related achortag is recieved here along with article id function searchAndReplace(keyword, anchorTag, articleId) { //selects the h3 h4 and p tags that are inside of the article let content = document.querySelector(`#${articleId} .entry-content`); //replaces the "linktext" in achor tag with the keyword that will be searched and replaced let newLink = anchorTag.replace('linktext', keyword); //regular expression to search keyword var re = new RegExp('(' + keyword + ')', 'g'); //this replaces the keywords in h3 h4 and p tags content with achor tag content.innerHTML = content.innerHTML.replace(re, newLink); } function articleFilter(keyword, anchorTag) { //gets all the articles var articles = document.querySelectorAll('article'); //if its zero or less then there are no articles if (articles.length > 0) { for (let x = 0; x < articles.length; x++) { //articles to skip is an array in which there are ids of articles which should not get effected //if the current article's id is also in that array then do not call search and replace with its data if (!articleIdsToSkip.includes(articles[x].id)) { //search and replace is called on articles which should get effected searchAndReplace(keyword, anchorTag, articles[x].id, key); } else { console.log( `Cannot replace the keywords in article with id ${articles[x].id}` ); } } } else { console.log('No articles found.'); } } let key; //not part of script, added for (key in keywordsAndLinks) { //key is the object in keywords and links object i.e ds, ml, ai for (let i = 0; i < keywordsAndLinks[key].keywords.length; i++) { //keywordsAndLinks[key].keywords is the array of keywords for key (ds, ml, ai) //keywordsAndLinks[key].keywords[i] is the keyword and keywordsAndLinks[key].link is the link //keyword and link is sent to searchreplace where it is then replaced using regular expression and replace function articleFilter( keywordsAndLinks[key].keywords[i], keywordsAndLinks[key].link ); } } function cleanLinks() { // (making smal functions is for DRY) this function gets the links and only keeps the first 2 and from the rest removes the anchor tag and replaces it with its text function removeLinks(links) { if (links.length > 1) { for (let i = 2; i < links.length; i++) { links[i].outerHTML = links[i].textContent; } } } //arrays which will contain all the achor tags found with the class (ds-link, ml-link, ailink) in each article inserted using search and replace let dslinks; let mllinks; let ailinks; let nllinks; let deslinks; let tdlinks; let iaslinks; let llinks; let pbplinks; let mlclinks; const content = document.querySelectorAll('article'); //all articles content.forEach((c) => { //to skip the articles with specific ids if (!articleIdsToSkip.includes(c.id)) { //getting all the anchor tags in each article one by one dslinks = document.querySelectorAll(`#${c.id} .entry-content a.ds-link`); mllinks = document.querySelectorAll(`#${c.id} .entry-content a.ml-link`); ailinks = document.querySelectorAll(`#${c.id} .entry-content a.ai-link`); nllinks = document.querySelectorAll(`#${c.id} .entry-content a.ntrl-link`); deslinks = document.querySelectorAll(`#${c.id} .entry-content a.des-link`); tdlinks = document.querySelectorAll(`#${c.id} .entry-content a.td-link`); iaslinks = document.querySelectorAll(`#${c.id} .entry-content a.ias-link`); mlclinks = document.querySelectorAll(`#${c.id} .entry-content a.mlc-link`); llinks = document.querySelectorAll(`#${c.id} .entry-content a.l-link`); pbplinks = document.querySelectorAll(`#${c.id} .entry-content a.pbp-link`); //sending the anchor tags list of each article one by one to remove extra anchor tags removeLinks(dslinks); removeLinks(mllinks); removeLinks(ailinks); removeLinks(nllinks); removeLinks(deslinks); removeLinks(tdlinks); removeLinks(iaslinks); removeLinks(mlclinks); removeLinks(llinks); removeLinks(pbplinks); } }); } //To remove extra achor tags of each category (ds, ml, ai) and only have 2 of each category per article cleanLinks(); */ //Recommended Articles var ctaLinks = [ /* ' ' + '

Subscribe to our AI newsletter!

' + */ '

Take our 85+ lesson From Beginner to Advanced LLM Developer Certification: From choosing a project to deploying a working product this is the most comprehensive and practical LLM course out there!

'+ '

Towards AI has published Building LLMs for Production—our 470+ page guide to mastering LLMs with practical projects and expert insights!

' + '
' + '' + '' + '

Note: Content contains the views of the contributing authors and not Towards AI.
Disclosure: This website may contain sponsored content and affiliate links.

' + 'Discover Your Dream AI Career at Towards AI Jobs' + '

Towards AI has built a jobs board tailored specifically to Machine Learning and Data Science Jobs and Skills. Our software searches for live AI jobs each hour, labels and categorises them and makes them easily searchable. Explore over 10,000 live jobs today with Towards AI Jobs!

' + '
' + '

🔥 Recommended Articles 🔥

' + 'Why Become an LLM Developer? Launching Towards AI’s New One-Stop Conversion Course'+ 'Testing Launchpad.sh: A Container-based GPU Cloud for Inference and Fine-tuning'+ 'The Top 13 AI-Powered CRM Platforms
' + 'Top 11 AI Call Center Software for 2024
' + 'Learn Prompting 101—Prompt Engineering Course
' + 'Explore Leading Cloud Providers for GPU-Powered LLM Training
' + 'Best AI Communities for Artificial Intelligence Enthusiasts
' + 'Best Workstations for Deep Learning
' + 'Best Laptops for Deep Learning
' + 'Best Machine Learning Books
' + 'Machine Learning Algorithms
' + 'Neural Networks Tutorial
' + 'Best Public Datasets for Machine Learning
' + 'Neural Network Types
' + 'NLP Tutorial
' + 'Best Data Science Books
' + 'Monte Carlo Simulation Tutorial
' + 'Recommender System Tutorial
' + 'Linear Algebra for Deep Learning Tutorial
' + 'Google Colab Introduction
' + 'Decision Trees in Machine Learning
' + 'Principal Component Analysis (PCA) Tutorial
' + 'Linear Regression from Zero to Hero
'+ '

', /* + '

Join thousands of data leaders on the AI newsletter. It’s free, we don’t spam, and we never share your email address. Keep up to date with the latest work in AI. From research to projects and ideas. If you are building an AI startup, an AI-related product, or a service, we invite you to consider becoming a sponsor.

',*/ ]; var replaceText = { '': '', '': '', '
': '
' + ctaLinks + '
', }; Object.keys(replaceText).forEach((txtorig) => { //txtorig is the key in replacetext object const txtnew = replaceText[txtorig]; //txtnew is the value of the key in replacetext object let entryFooter = document.querySelector('article .entry-footer'); if (document.querySelectorAll('.single-post').length > 0) { //console.log('Article found.'); const text = entryFooter.innerHTML; entryFooter.innerHTML = text.replace(txtorig, txtnew); } else { // console.log('Article not found.'); //removing comment 09/04/24 } }); var css = document.createElement('style'); css.type = 'text/css'; css.innerHTML = '.post-tags { display:none !important } .article-cta a { font-size: 18px; }'; document.body.appendChild(css); //Extra //This function adds some accessibility needs to the site. function addAlly() { // In this function JQuery is replaced with vanilla javascript functions const imgCont = document.querySelector('.uw-imgcont'); imgCont.setAttribute('aria-label', 'AI news, latest developments'); imgCont.title = 'AI news, latest developments'; imgCont.rel = 'noopener'; document.querySelector('.page-mobile-menu-logo a').title = 'Towards AI Home'; document.querySelector('a.social-link').rel = 'noopener'; document.querySelector('a.uw-text').rel = 'noopener'; document.querySelector('a.uw-w-branding').rel = 'noopener'; document.querySelector('.blog h2.heading').innerHTML = 'Publication'; const popupSearch = document.querySelector$('a.btn-open-popup-search'); popupSearch.setAttribute('role', 'button'); popupSearch.title = 'Search'; const searchClose = document.querySelector('a.popup-search-close'); searchClose.setAttribute('role', 'button'); searchClose.title = 'Close search page'; // document // .querySelector('a.btn-open-popup-search') // .setAttribute( // 'href', // 'https://medium.com/towards-artificial-intelligence/search' // ); } // Add external attributes to 302 sticky and editorial links function extLink() { // Sticky 302 links, this fuction opens the link we send to Medium on a new tab and adds a "noopener" rel to them var stickyLinks = document.querySelectorAll('.grid-item.sticky a'); for (var i = 0; i < stickyLinks.length; i++) { /* stickyLinks[i].setAttribute('target', '_blank'); stickyLinks[i].setAttribute('rel', 'noopener'); */ } // Editorial 302 links, same here var editLinks = document.querySelectorAll( '.grid-item.category-editorial a' ); for (var i = 0; i < editLinks.length; i++) { editLinks[i].setAttribute('target', '_blank'); editLinks[i].setAttribute('rel', 'noopener'); } } // Add current year to copyright notices document.getElementById( 'js-current-year' ).textContent = new Date().getFullYear(); // Call functions after page load extLink(); //addAlly(); setTimeout(function() { //addAlly(); //ideally we should only need to run it once ↑ }, 5000); }; function closeCookieDialog (){ document.getElementById("cookie-consent").style.display = "none"; return false; } setTimeout ( function () { closeCookieDialog(); }, 15000); console.log(`%c 🚀🚀🚀 ███ █████ ███████ █████████ ███████████ █████████████ ███████████████ ███████ ███████ ███████ ┌───────────────────────────────────────────────────────────────────┐ │ │ │ Towards AI is looking for contributors! │ │ Join us in creating awesome AI content. │ │ Let's build the future of AI together → │ │ https://towardsai.net/contribute │ │ │ └───────────────────────────────────────────────────────────────────┘ `, `background: ; color: #00adff; font-size: large`); //Remove latest category across site document.querySelectorAll('a[rel="category tag"]').forEach(function(el) { if (el.textContent.trim() === 'Latest') { // Remove the two consecutive spaces (  ) if (el.nextSibling && el.nextSibling.nodeValue.includes('\u00A0\u00A0')) { el.nextSibling.nodeValue = ''; // Remove the spaces } el.style.display = 'none'; // Hide the element } }); // Add cross-domain measurement, anonymize IPs 'use strict'; //var ga = gtag; ga('config', 'G-9D3HKKFV1Q', 'auto', { /*'allowLinker': true,*/ 'anonymize_ip': true/*, 'linker': { 'domains': [ 'medium.com/towards-artificial-intelligence', 'datasets.towardsai.net', 'rss.towardsai.net', 'feed.towardsai.net', 'contribute.towardsai.net', 'members.towardsai.net', 'pub.towardsai.net', 'news.towardsai.net' ] } */ }); ga('send', 'pageview'); -->