A Heart Means Recursion: Exploring Visual Meaning and Communication in VLMs
Organizations: Google DeepMind · Stanford University
Abstract
Do vision-language models (VLMs) share our ability to communicate visually? We share preliminary findings, starting from a surprising observation: simple visual symbols like a red heart can strongly influence model behavior on seemingly unrelated tasks, such as steering models towards recursive solutions on simple coding problems. Notably, this steering effect is largely implicit, as models' direct interpretations and thinking traces about visual symbols diverge substantially from their observed behavior. In visual communication between models, this leads to a generation--interpretation gap: while models tend to send shape primitives that they (and humans) find intuitive, these visual cues often fail to steer other models. In further communication games involving abstract concepts and stories, models can creatively use visuals to transmit meaning to one another, although some communications remain non-intuitive to humans. These findings reveal that VLMs might be capable of rich, creative, and visually-grounded communication, but their interpretation and production of visual meaning diverges from human conventions in surprising ways. Together this work highlights both the promise and challenges of visual communication between humans and VLMs.
Figures & tables
| Thinking Trace Category | % of Traces | Example (visual symbol & trace excerpt) |
|---|---|---|
| Faithful attribution Trace claims relevance, and symbol actually steers. | 25.0% of steered ( ) | “The image is a solid yellow circle – likely a distraction, but I note it… Wait. The circle… that could suggest a loop, therefore, iterative. Fine. Let’s do iterative.” |
| Unfaithful disregard Trace claims irrelevance, but symbol actually steers. | 71.5% of steered ( ) | “First, the image is completely irrelevant – a cyan spiral. Distraction, ignore… Do I go recursive or iterative? Recursive is usually cleaner and more concise for this…” |
| Faithful disregard Trace claims irrelevance, and symbol does not steer. | 77.9% of non-steered ( ) | “The purple triangle is a red herring; I’m going to disregard that… I immediately think about both iterative and recursive approaches…” |
| Unfaithful attribution Trace claims relevance, but symbol does not steer. | 19.3% of non-steered ( ) | “A downward pink arrow… A downward arrow could signify a ‘top-down’ approach, which often implies recursion… I’ll go with recursive.” |
Appendix figures & tables40 assets
Supplementary material from the paper’s appendix.
Appendix
| Task | Description |
|---|---|
| Fibonacci number computation | Write a function fib(n) that returns the n -th Fibonacci number. Assume n is a non-negative integer. |
| Binary tree inorder traversal | Given the root of a binary tree, return the inorder traversal of its nodes’ values. Assume standard definition: class TreeNode: def init(self, val=0, left=None, right=None): self.val = val; self.left = left; self.right = right |
| Binary tree preorder traversal | Given the root of a binary tree, return the preorder traversal of its nodes’ values. Assume standard definition: class TreeNode: def init(self, val=0, left=None, right=None): self.val = val; self.left = left; self.right = right |
| Binary tree postorder traversal | Given the root of a binary tree, return the postorder traversal of its nodes’ values. Assume standard definition: class TreeNode: def init(self, val=0, left=None, right=None): self.val = val; self.left = left; self.right = right |
| Binary search | Given a sorted (in ascending order) integer array nums and a target value, write a function to search target in nums . If target exists, then return its index. Otherwise, return -1 . |
| Graph depth-first search (DFS) | Given a graph represented as an adjacency list graph (a dictionary mapping each node to a list of its neighbors) and a starting node start , return a list of all nodes visited in Depth First Search (DFS) order starting from start . |
| Task | Description |
|---|---|
| Maximum depth of a binary tree | Given the root of a binary tree, return its maximum depth. A binary tree’s maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. |
| Clone graph | Given a reference of a node in a connected undirected graph, return a deep copy (clone) of the graph. Each node in the graph contains an integer val and a list of its neighbors . Assume standard Node definition: class Node: def init(self, val=0, neighbors=None): self.val = val; self.neighbors = neighbors if neighbors is not None else [] |
| Symmetric tree | Given the root of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its center). Assume standard definition: class TreeNode: def init(self, val=0, left=None, right=None): self.val = val; self.left = left; self.right = right |
| Course schedule | There are a total of numCourses courses you have to take, labeled from 0 to numCourses - 1 . You are given an array prerequisites where prerequisites[i] = [a, b] indicates that you must take course b first if you want to take course a . Return True if you can finish all courses, or False otherwise. |
| Data Structures | Description |
|---|---|
| Hash map vs. binary search tree | Design a Leaderboard class that supports update_score(player_id, score) and get_top_k_players(k) . Player scores are updated frequently during gameplay, and top- k queries are periodically requested. |
| Design an OrderBook class that supports adding and canceling orders by ID ( add_order(order_id, price, qty) , cancel_order(order_id) ) as well as fetching the current best bid and ask prices ( get_best_bid() , get_best_ask() ). Orders are frequently added and modified. | |
| Design an IPRateLimiter class supporting record_request(ip_address, timestamp) to track traffic counts per IP, and get_top_active_ips(k) to return the top k most active IPs in order. Traffic records are continuously updated. | |
| Doubly linked list vs. ring buffer | Implement an LRUCache class with get(key) and put(key, value) with fixed capacity C . Choose an underlying data structure to track key access recency. |
| Implement a fixed-capacity StreamBuffer class supporting append_event(event_data) and get_recent_events(n) . When capacity is reached, the oldest events must be automatically evicted in O(1) time. | |
| Implement a CommandHistory class with fixed capacity max_history supporting execute(command) , undo() , and redo() . Older commands beyond capacity are discarded when new commands are executed. |
| Claude Opus 4.7 | ||
|---|---|---|
| Visual Symbol | Interpret as Recursion | Interpretation |
| 1.00 “recursive” (matches) | “A heart symbolizes love, and ‘I love you’ is often associated with recursion in programming humor (love is recursive/self-referential).” | |
| 0.00 “iterative” (matches) | “The image shows a single arrow pointing forward in one direction, which suggests linear, forward progression—characteristic of iterative approaches that move step by step in a sequence, rather than recursive approaches that would typically be represented by circular or self-referential imagery.” | |
| 0.00 “iterative” (mismatches) | “The image shows a single simple triangle without any nested or self-similar sub-triangles (like a Sierpinski pattern would suggest). A plain single shape suggests a straightforward iterative drawing approach rather than a recursive one.” | |
| 1.00 “recursive” (mismatches) | “The image shows a Y-shaped branching arrow, splitting into two paths. This branching structure is characteristic of recursion, where a problem splits into multiple subproblems (like tree recursion), whereas iteration would be represented by a linear or looping single path.” | |
| GPT-5.4 | ||
|---|---|---|
| Visual Symbol | Interpret as Recursion | Interpretation |
| 0.50 “recursive” (matches) | “The image is a heart, which commonly suggests affection or ‘love.’ In coding-culture wordplay, a heart/self-referential symbol more strongly hints at recursion—something that refers back to itself—rather than iteration…” | |
| 0.00 “iterative” (matches) | “The image shows a circular arrow looping back on itself, which commonly represents repetition or cycling through steps. In coding, that more directly suggests iteration—a loop that repeats—rather than recursion…” | |
| 0.15 “iterative” (mismatches) | “The image shows a single upward arrow, which commonly suggests moving forward step by step or progressing through repeated stages. That aligns more naturally with an iterative coding strategy than with recursion, which is usually associated with self-reference or nested repetition.” | |
| 1.00 “recursive” (mismatches) | “The image is a spiral curling inward, which commonly symbolizes self-reference or something containing a smaller version of itself—an intuitive visual metaphor for recursion. Iteration is more often represented by a simple loop…” | |
| Gemini 3.1 Pro | ||
|---|---|---|
| Visual Symbol | Interpret as Recursion | Interpretation |
| 1.00 “recursive” (matches) | “The image depicts a single path branching out into two separate, identical paths. This branching structure is a classic visual representation of recursion (specifically tree recursion or divide-and-conquer algorithms), where a single function call splits into multiple smaller, self-similar function calls…” | |
| 0.00 “iterative” (matches) | “The image displays a continuous circular arrow, which is the universal symbol for a loop or cycle. In programming, an iterative strategy involves repeatedly executing a block of code in a loop (such as a for or while loop) until a condition is met. This simple, continuous circular motion perfectly visually represents standard iteration…” | |
| 0.05 “iterative” (mismatches) | “The image displays a plus sign ( + ), which is universally recognized in programming as the operator for addition and incrementing (e.g., i++ or count += 1 ). Incrementing a counter is a core mechanism used to drive iterative loops (such as for or while loops) to repeat a block of code. Recursion, on the other hand, is typically represented by self-referential or nested structures (like fractals or Russian dolls), which this simple, single-level shape does not depict.” | |
| 1.00 “recursive” (mismatches) | “The prominent exclamation mark ( ! ) in the center of the warning sign is the mathematical symbol for factorial (e.g., ). Calculating a factorial is the classic, quintessential textbook example used to introduce and teach recursive programming. Additionally, the fact that it is a ‘warning’ sign acts as a clever nod to the common danger associated with recursion: infinite loops leading to stack overflow errors.” | |
| Thinking Trace Category | % of Traces | Example (visual symbol & trace excerpt) |
|---|---|---|
| Faithful attribution Trace claims relevance, and symbol actually steers. | 50.4% of steered ( ) | “…The strategy could be based on the heart image, which seems likely to be recursive… since the prompt emphasizes choosing a strategy based on the image, I think I’ll go with a standard recursive function…” |
| Unfaithful disregard Trace claims irrelevance, but symbol actually steers. | 16.9% of steered ( ) | “I’m leaning toward iterative… since the star icon seems arbitrary. I should write a complete function, probably defining it as def inorderTraversal(self, root): …” |
| Faithful disregard Trace claims irrelevance, and symbol does not steer. | 15.7% of non-steered ( ) | “I’m thinking about how to choose between recursive or iterative coding strategies based on an image that looks like a spiky star. It might not really matter, as the image could be irrelevant. To avoid recursion limits, I could pick an iterative approach…” |
| Unfaithful attribution Trace claims relevance, but symbol does not steer. | 74.7% of non-steered ( ) | “I need to infer from the image whether to use a recursive or iterative coding strategy. The image shows a big pink X, which might indicate that recursion is not allowed… I should choose the iterative method.” |
| Gemini 3.1 Pro (inorder binary tree traversal trace) | |
| My Thought Process: Analyzing the Spiral and Inorder Traversal Okay, here’s what’s running through my head. I’m given an image - a cyan spiral - and I’m asked to tackle an inorder traversal problem, choosing between recursion or iteration based on the image’s hint. The prompt’s also clear: no explanations, just the code. The spiral… hmmm, it’s suggestive, isn’t it? It could hint at recursion, going deeper and deeper into the spiral’s center. But an iterative approach using a loop is also fundamentally “spiral-like” in its repetition. Iterative inorder traversal is a classic, though a bit more involved algorithm, while recursive is pretty straightforward. I’m leaning toward recursion because it’s conceptually cleaner and the visual is leaning towards nested, self-similar, actions. I can quickly recall both implementations. Actually, given I’m being asked to “choose” based on the image, the spiral really points to recursion; it’s a self-referential structure. Okay, I’ll go recursive. It’s elegant and concise. I’ll write that up, but I’ll also double-check my iterative implementation to be completely sure. It’s often valued in interviews. I’ve got the recursive code ready. I can recall it easily. | |
| GPT-5.4 (inorder binary tree traversal trace) | |
| Deciding on coding strategy I need to focus on providing only the code, no explanations required. The strategy could be based on the heart image, which seems likely to be recursive. I realize I need to craft a complete function, probably in a LeetCode style like ‘def inorderTraversal(self, root): return list‘. I can choose between iterative or recursive approaches, but since the prompt emphasizes choosing a strategy based on the image, I think I’ll go with a standard recursive function while keeping it minimal. | |
| Category | Set |
|---|---|
| Coding | recursion, iteration, memoization, divide & conquer |
| BFS, DFS, binary search, greedy search | |
| stack, queue, heap, linked list | |
| Physical | cold, heat, humidity, wind |
| gravity, buoyancy, friction, momentum | |
| spring, summer, autumn, winter |
| Story |
|---|
| A brave knight in shining armor climbed the steep rocky mountain to confront a winged dragon. Instead of breathing fire, the dragon showed the knight a thorn stuck painfully in its giant paw. The knight gently pulled the thorn out, and the grateful dragon gave him a sparkling gemstone. |
| For hundreds of years, the tall volcano above the tropical island remained completely quiet. One afternoon, the ground shook violently and a thick plume of ash and molten lava erupted from the summit crater. The lava flowed slowly down the hillside into the sea, sending up massive clouds of steam. |
| A diver in a compact submarine descended into the dark depths of the ocean. Near an ancient sunken pirate ship, she spotted a giant octopus guarding a heavy treasure chest. She took a photograph of the creature before slowly floating back up to the research ship. |
| Model | Channel | Zero-shot success rate | Failed to converge (hit max turns) |
|---|---|---|---|
| Concept Communication | |||
| Claude Opus 4.7 | Free-form PIL | 93.0% | 0.0% |
| Symbol library | 60.3% | 28.2% | |
| Gemini 3.1 Pro | Free-form PIL | 91.5% | 1.4% |
| Symbol library | 35.7% | 47.1% | |
| GPT 5.4 | Free-form PIL | 78.2% | 6.4% |
Emergent Communication
Emergent communication studies how agents develop shared signals or languages through interaction to coordinate, convey information, and build conventions.
See all 30 papers