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

This AI newsletter is all you need #38
Latest   Machine Learning

This AI newsletter is all you need #38

Last Updated on July 25, 2023 by Editorial Team

Author(s): Towards AI Editorial Team

Originally published on Towards AI.

What happened this week in AI by Louis

This week, AI continues to thrive under competitive pressure, and excitement is building for the arrival of GPT-4. Tech giants, generative AI startups, and even individuals are competing to be at the forefront of the AI landscape by providing viable alternatives to ChatGPT. The generative AI space has also become an increased focus for venture capital, and the latest example is Stability AI, which is reportedly in talks to raise funds at a $4 billion valuation. While many generative AI startups can be bootstrapped and built on the back of API access to models such as GPT or cheap fine-tuning, larger raises are still needed to build out GPU clusters for training or to pay for cloud training and inference.

As we have been tracking in this newsletter, there has been great progress towards open-source alternatives to models such as ChatGPT in the last few weeks, as well as signs of increased flexibility in access to these models and alternatives to OpenAI. We were particularly excited to see a project from Stanford to fine-tune Meta’s 7BN llama model (whose weights recently leaked) using an open-source model called Alpaca. They created 52k instruction-following examples using OpenAI da-vinci, then supervised fine-tuned the model for three hours on eight 80GB A100s (costing just ~$100). The resulting model can also run on a single GPU, albeit slowly. It performs similarly to ChatGPT on many tasks. We see huge potential for an increased pace of breakthroughs in NLP and transformers now that access to these models is available outside of large tech companies and for affordable fine-tuning costs.

This week, AI21 Labs launched Jurassic-2 and Task-Specific APIs, which is another positive step towards competitive access to LLMs via API and increased transparency. Jurassic-2 is the next generation of AI21’s foundation models, including significant quality improvements and new capabilities.

As we prepare for a future where rapid AI progress leads to transformative AI systems, it is crucial to prioritize supporting AI safety research. OpenAI and Anthropic AI, among others, have been vocal about the importance of AI safety. Anthropic believes that empirically grounded safety research will have the most relevance and impact and acknowledges that a major reason for its existence as an organization is the necessity to conduct safety research on “frontier” AI systems. While new open source access to these models is promising for the pace of progress and reducing concentration of power within a few large companies, it also provides increasing flexibility for misuse of these models. It is hard to know whether OpenAI’s policy of gating access to these models via API access with checks and balances in place or more open access to these models would be the best model for limiting harm, but it seems we are already going down different paths.

Hottest News

  1. Microsoft mentioned the imminent release of GPT-4

GPT-4 is coming next week! At a hybrid information event entitled “AI in Focus — Digital Kickoff” on 9 March 2023, four Microsoft Germany employees presented Large Language Models (LLM) like the GPT series as a disruptive force for companies and their Azure-OpenAI offering.

2. Stability AI looks to raise funds at $4B valuation as artificial intelligence captivates investors

According to reports, the parent company of Stable Diffusion, an AI tool for creating digital images, is looking to raise funds at a valuation of approximately $4 billion. However, a final decision has not been made regarding the financing, and the valuation is subject to change.

3. Google’s Universal Speech Model (USM): State-of-the-art speech AI for 100+ languages

Google recently shared its Universal Speech Model (USM), which it claims to be a critical first step towards supporting 1,000 languages. USM is a family of speech models with 2B parameters trained on 12 million hours of speech and 28 billion sentences of text, spanning 300+ languages.

4. Anthropic’s core views on AI safety — When, why, what, and how

Anthropic AI recently shared why it anticipates rapid progress in AI and large impacts from the technology, which has led to concerns about AI safety. The company emphasizes the urgency of supporting AI safety research, which should be done by a wide range of public and private actors.

5. MuAViC: The first audio-video speech translation benchmark

Meta AI has released MuAViC (Multilingual Audio-Visual Corpus), the first benchmark designed to enable the use of audio-visual learning for highly accurate speech translation. MuAViC will also be used to train Meta’s AV-HuBERT model to translate speech into challenging and noisy environments.

Three 5-minute reads/videos to keep you learning

  1. Fine-tuning 20B LLMs with RLHF on a 24GB consumer GPU

HuggingFace has recently released the integration of trl with peft, which aims to make Large Language Model (LLM) fine-tuning with Reinforcement Learning more accessible. This library is designed to simplify the RL step and provide more flexibility.

2. The State of Competitive Machine Learning

This article summarizes the state of the competitive landscape by analyzing over 200 competitions that took place in 2022. Additionally, it delves into the analysis of 67 winning solutions to identify the best strategies for winning at competitive ML.

3. Emergent Abilities of Large Language Models

This article explores the concept of ‘emergence’ in general before delving into its application to Large Language Models. It also discusses the underlying reasons for these emergent abilities and their implications.

4. The Waluigi Effect (mega-post)

This article presents a mechanistic explanation of the Waluigi Effect and other bizarre “semiotic” phenomena that arise within large language models, such as GPT-3/3.5/4 and their variants (ChatGPT, Sydney, etc.). It proposes a novel idea of “flattery and dialog” in prompt engineering.

5. Using AI to turn the Web into a database

This article presents a promising approach to implementing the semantic web using powerful Large Language Models (LLMs) combined with knowledge bases. It also proposes the concept of “Semantic Web Agents” that can navigate the web and perform tasks on behalf of users.

Papers & Repositories

  1. PaLM-E: An Embodied Multimodal Language Model

The paper presents an experiment with a pre-trained LLM (PaLM) and a pre-trained model for vision (ViT) These models are combined with new learnable weights in a larger neural network to solve tasks that involve language, vision, and planning.

2. Visual ChatGPT

The Visual ChatGPT connects ChatGPT with a series of Visual Foundation Models, enabling users to send and receive images during chatting. The goal is to build an AI that can handle various tasks by combining the general interface of ChatGPT with the domain expertise of foundational models.

3. Large Language Models Encode Clinical Knowledge

MultiMedQA is a benchmark combining six existing open question answering datasets spanning professional medical exams, research, and consumer queries.

4. Prismer: A Vision-Language Model with An Ensemble of Experts

Prismer, is a data- and parameter-efficient vision-language model that leverages an ensemble of domain experts. Experimental results demonstrate that Prismer achieves competitive performance with current state-of-the-art models in fine-tuned and few-shot learning tasks while requiring up to two orders of magnitude less training data.

5. Prompt, Generate, then Cache: Cascade of Foundation Models makes Strong Few-shot Learners

The Cascade of Foundation models (CaFo) is a framework that combines various pre-training paradigms, including CLIP, DINO, DALL-E, and GPT-3, to improve few-shot learning. CaFo uses a “Prompt, Generate, then Cache” approach to leverage the strengths of each pre-training method and achieve state-of-the-art performance in few-shot classification.

Enjoy these papers and news summaries? Get a daily recap in your inbox!

The Learn AI Together Community section!

Announcing the What’s AI Podcast!

Louis Bouchard has launched a new project aimed at demystifying the various roles in the AI industry and discussing interesting AI topics with expert guests. The podcast, available on Spotify and Apple Podcasts, features interviews with industry experts. The latest episode features Chris Deotte, a Quadruple Kaggle Grandmaster at NVIDIA, who discusses topics such as crafting a strong data science resume, achieving grandmaster status on Kaggle, working at NVIDIA, and approaches to current data science challenges. Right now users have the opportunity to participate in a NVIDIA RTX 4080 giveaway directly from the podcast! Check it out here.

Meme of the week!

Meme shared by dimkiriakos#2286

Featured Community post from the Discord

AdriBen#5135 shared a paper titled “A Scalable, Interpretable, Verifiable & Differentiable Logic Gate Convolutional Neural Network Architecture From Truth Tables” and a DCNN design that could be suitable for security for formal verification, rule model, fairness, and trustworthy machine learning‌. This paper introduces a new definition of the elementary convolution operator as a tractable Boolean Function, which enables the computation of the complete distribution of the neural network before production. Read it here and support a fellow community member. Share your feedback and questions in the thread here!

AI poll of the week!

Join the discussion on Discord.

TAI Curated section

Article of the week

How Can Hardcoded Rules Overperform ML? by Ivan Reznikov

Although machine learning has its advantages in problem-solving, it is not always the best solution. In certain areas, such as those where interpretability, robustness, and transparency are critical, rule-based systems may even outperform machine learning. This article discusses the use cases of hybrid systems and the benefits of integrating them into an ML pipeline. We will examine practical examples of industries, such as healthcare, finance, and supply chain management.

Our must-read articles

The Impact of 5G Technology on IoT & Smart Cities by Deepankar Varma

PCA: Bioinformatician’s Favorite Tool Can Be Misleading by Salvatore Raieli

If you are interested in publishing with Towards AI, check our guidelines and sign up. We will publish your work to our network if it meets our editorial policies and standards.

Job offers

Expert Data Scientist @Impact (Remote)

Data Engineer V @ID.me (Remote)

Associate Data Scientist @Freenome (Remote)

Data Scientist @Deep Genomics (Remote)

Machine Learning Scientist @Convergent Research (Remote)

Senior Full Stack Engineer @ClosedLoop (Remote)

Senior ML Engineer @SuperAnnotate (Yerevan, Armenia)

Senior Data Engineer — Analytics @ASAPP (Bangalore, India/Hybrid)

Interested in sharing a job opportunity here? Contact sponsors@towardsai.net.

If you are preparing your next machine learning interview, don’t hesitate to check out our leading interview preparation website, confetti!

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