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

What’s It Like to Work in Applied AI?
Latest   Machine Learning

What’s It Like to Work in Applied AI?

Last Updated on July 26, 2023 by Editorial Team

Author(s): Branden Lisk

Originally published on Towards AI.

Understanding the role of a Machine Learning Engineer from an early-career perspective

Source: Photo by Possessed Photography on Unsplash

Introduction

Disclosure and Accuracy

This article is written from the perspective of an early-career stage: 2+ years in the tech space, 1+ years of applied AI/ML experience, with an (expected) bachelor’s level degree in engineering. The bulk of experience lies in start-up, small, and medium-sized environments, which are inherently less structured than established organizations.

The author strives to maintain accurate information that is useful to a general audience. However, note that information on this topic evolves quickly, and practices can be wildly different from organization to organization, so there is an abundance of conflicting opinions from various sources.

Intended Audience

This article is intended for other early-career engineers in the field of applied AI, software engineers interested in a career transition, and anyone else with interest in this topic.

What is Applied AI?

There are plenty of existing resources to dig deeper into this, but in summary, applied AI is:

“…the branch of artificial intelligence that brings it out of the lab and into the real world…” [1]

In essence, applied AI is taking scientific research and applying it to business problems.

What is a Machine Learning Engineer?

It would be helpful to start with a definition of machine learning. It’s defined as:

“…the process of using mathematical models of data to help a computer learn without direct instruction. This enables a computer system to continue learning and improving on its own, based on experience.” [2]

Essentially, “AI” is the idea of an “intelligent” machine. Machine learning is the process used to develop that “intelligence”. So in this context, a Machine Learning (ML) Engineer designs and builds the infrastructure needed to enable the process of machine learning.

We’ll discuss more on the particular responsibilities of an ML Engineer later.

Expectation vs. Reality

How does this differ from how we traditionally understand the role of an engineer who works in the field of “Machine Learning” and “Artificial Intelligence”? It’s likely we think of someone who does the following:

  • a lot of research and reading into published papers,
  • approaching new and novel problems,
  • planning and conducting experiments to invent new methods to solve these problems,
  • publishing new papers.

These responsibilities are actually fulfilled by someone we’d call a “Research Scientist” or even a “Data Scientist”. We’re falsely attributing theory to practice.

In reality, this is actually what we can expect to see in practice:

Source: Image by the author, designed using resources from Flaticon and Freepik

We can see that staying informed of current research and approaches to problems by reading papers is unchanged. However, each other point has an analogous responsibility more reflective of a machine learning engineer’s day-to-day.

We’ll talk more about these distinctions a bit later. First, we have to discuss some industry jargon that is thrown around in the “Applied AI” space.

Convoluted Separation of Responsibilities

Job Titles

This is the area where you’ll experience the most conflicting opinions. The separation of responsibilities according to different job titles is not consistent between organizations or even sub-teams within the same organization. Trying to understand different descriptions and convoluted diagrams is largely a waste of time and will make you even more confused about the distinctions. Trust me, when I tried for this article, I started to question what my own job even is. You’ll hear some subset of the following titles:

  • Data Engineer
  • Data Scientist
  • Applied Data Scientist
  • Data Analyst
  • Business Analyst
  • ML Engineer
  • MLOps
  • Data Infrastructure Engineer
  • DevOps

Organizations describing job postings, as well as individuals describing past experiences, use many of these terms interchangeably, so it’s very hard to find consistent data.

At the risk of adding more confusion to this argument, I’ll define my own generic titles that have no major significance outside of this article, according to how they fit into the data science process.

Data Science Process

Standard data science process. Black arrows represent the main flow, grey dashed arrows represent decision points in which we return to a previous step. (Source: Image by the author, inspired by [3] and [4])

We can see five distinct “roles” in the above diagram:

  • Business: This stage involves understanding and formulating the business problem and defining the goal of the project. This role would typically be called a “Business (and/or Data) Analyst”.
  • Data: This stage involves iterating until the desired amount and quality of data is achieved for feature engineering. These include understanding potential data sources that could be used to solve the business problem (assessing key factors such as availability, usability, quality, and cost), collecting said data, and cleaning (mitigating outliers, resampling, etc.) the collected data. This would be assigned to a combination of the “Data Engineer” and “Data Labeler”. Building the data pipeline would typically be assigned to the “Data Infrastructure Engineer”.
  • Model: This stage involves two parts: feature engineering and modeling. The collected data is used to perform feature engineering. A model is selected, built, and trained. The model is then evaluated against the metrics set in the “Business” stage. If it does not achieve the required metrics, we have to assess the problem and return to a previous step. This role has the most inconsistency in terms of job title. It can be any of: “Data Scientist” (the most incorrect), “Applied Data Scientist,” or “Data Analyst”.
  • Operations: This stage involves deploying, serving, and monitoring the completed model. Monitoring is a continuous action for the lifetime of the model. This role would traditionally be called “DevOps” (software development and IT operations) but is typically called “MLOps” (machine learning operations) for machine learning projects.
  • Maintenance: Finally, if monitoring detects the model is no longer achieving the desired metrics, we must revert to a previous stage in the process.

Covering the missing title from above, the responsibilities of an “ML Engineer” are Data, Model, Operations, and Maintenance, typically with an emphasis on Data and Model.

Early-Career Perspective

Now that we understand what “applied AI” is from a high-level and the common roles you’ll hear in the field, what does this mean for you? In this section, we’ll discuss what you can expect as an early-career ML Engineer.

Source: Photo by Saulo Mohana on Unsplash

Common Misconceptions

We’ll start by walking through some misconceptions about the field.

Machine learning is heavy in statistics. You need deep statistical knowledge to work in the field.

If you tell people you work in machine learning, you’ll often hear, “wow, you must be really good with statistics and math,” and my response is usually, “Maybe? But it’s not incredibly relevant for my job”.

This is to say that this statement is true to an extent but heavily exaggerated. At its backbone, machine learning is just a new application of old mathematics: statistics, linear algebra, and calculus. It’s important to understand the fundamentals to understand how to apply machine learning truly effectively.

However, this only goes so far. As an ML Engineer, will you ever need to implement backpropagation from scratch? Probably not. Modern ML frameworks abstract all of this fundamental understanding away (for better or for worse). Will you need to understand the math used in research papers (at a high level)? Absolutely. This is required knowledge to adapt their approach to your own business problem effectively.

You need a graduate-level degree to work in the machine learning field.

This is untrue from an early-career perspective in the applied AI field. Many that work in this field do have advanced degrees, but that doesn’t imply that you need an advanced degree. Many that I have worked with prove that this isn’t necessarily true (at least anecdotally).

Practical machine learning engineering is quite a bit more traditional software engineering than you’d think.

Machine learning is all research.

Machine learning engineers are engineers at their core.

“Engineers are individuals who combine knowledge of science and mathematics to solve technical problems that confront society.” [5]

ML engineers utilize scientific research to solve business problems. They care more about how to make the solution work in practice. Most problems are solved problems, and understanding and adapting existing solutions to a business use case is the primary goal.

Where do you fit in?

As an early-career machine learning engineer, where in this process do you fit? This can heavily depend on the organization, but I’ll describe this as generally as possible.

Referring to the “Data Science Process” diagram, I’ll break this down into individual sections.

  • Business: Generally, you will not be involved in this stage. You may be approached to discuss technical feasibility and, in some rare cases (specifically start-ups), may be involved in prioritizing business problems.
  • Data: You’ll be quite involved in this stage—specifically, understanding data sources and cleaning data. Data collection is often outsourced in larger organizations (if it’s needed at all). In rare cases (again, start-ups), you’ll collect the data yourself. This is generally the most lengthy (and most important) stage.
  • Model: You’ll be very involved in this stage. Feature engineering and modeling are generally your full responsibility.
  • Operations: You’ll likely not be involved in this stage. Most organizations have a dedicated DevOps team that will handle this. The exception would be configuring model monitoring tools specific to your application.
  • Maintenance: You’ll be responsible for future maintenance of your deployed models. I’d suggest you make this process as easy as possible for yourself (if you’re wondering what could go wrong, check out a previous post).

Conclusion

We’ve seen what “Applied AI” is and the job titles of those who work in the field. We also saw the various stages of the data science process and where the “Machine Learning Engineer” fits in. Using this knowledge as a foundation, we explored the key responsibilities of an early-career machine learning engineer and some common misconceptions about the field.

I hope this article paints a realistic picture of the early-career environment of the applied AI field and helps guide you on the next step of your career.

This is just the beginning! If you enjoyed the article, follow me to get notified of the next ones! I appreciate the support U+2764️

Branden Lisk — Medium

Read writing from Branden Lisk on Medium. Machine Learning R&D Engineer U+1F916 U+007C Passionate about building cool and…

medium.com

Sources

[1] “Applied Artificial Intelligence,” Cognizant Technology Solutions. [Online]. Available: https://www.cognizant.com/us/en/glossary/applied-ai. [Accessed: 24-Jul-2022].

[2] “Artificial Intelligence vs. Machine Learning,” Microsoft Azure. [Online]. Available: https://azure.microsoft.com/en-us/solutions/ai/artificial-intelligence-vs-machine-learning/#introduction. [Accessed: 24-Jul-2022].

[3] C. Nantasenamat, “The Data Science Process,” Towards Data Science, 27-Jul-2020.

[4] A. Burkov, Machine Learning Engineering. Québec, Canada: True Positive Inc., 2020.

[5] D. Wang, “The Engineering Profession,” in ECE 190, 2018.

Join thousands of data leaders on the AI newsletter. Join over 80,000 subscribers and keep up to date with the latest developments 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.

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'); -->