If there is one technology that I am super excited about, it’s self-driving tech. I think it’s one of the most important techs in terms of the noticeable effects it will have on everyone’s daily life. Machine learning, AI, big data. All of those are important, but to a random person on the street, they either won’t notice the impact or realize the underlying tech that causes it.
Self-driving cars are not like that. Maybe I’m biased for living in Pittsburgh, where it’s a common sight to see self-driving Ubers (and I even saw an Argo car today). People will get a lot of their own time back as they can immediately get a car and be productive in it. Many people, myself included, base their job choices around a commute. But when your commute doesn’t need to include being aware of traffic, it gets much less bothersome. There will be fewer accidents as cars are able to talk to each other and avoid each other. Inter-car communication networks will also serve to lessen traffic issues as cars will be able to talk to each other and optimize routes.
From a monetary perspective, Transportation-as-a-Service could have a huge effect on bank accounts. People may be able to save significant money by renting out cars without even needing to drive them or hand over the keys. Neighborhood ride shares may pop up, perhaps where 10 houses agree to split payments on 7-8 cars, which would lower car payments for each. Naturally, if all cars were taken at a given time, the user would still be able to order loaner a car from a nearby dealer lot.
Deep Learning for Self-Driving Cars
The more I thought about it, the more I realized that I needed to put my attention and focus where my mouth is. It’s one thing to announce that self-driving is the most fascinating tech out there now, but it’s another thing to understand it and work towards making it better.
I found the MIT Deep Learning for Self-Driving Cars class and it was perfect. I will post more about my findings later once I finish the course, but I wanted to share my first project from the class.
The goal of the project is to get your car to navigate through traffic while trying to gain the highest average MPH possible. Safety settings are already built in, so you can’t change those. You can change the following inputs:
- How many lanes to each side the car is monitoring.
- The number of spaces in front of your car being monitored.
- The number of spaced behind your car being monitored.
- The number of training iterations your network goes through.
There are other, more advanced changes you can make, but for the sake of expedited experimentation, I stuck with just the major inputs. Students in the course need to exceed 65 MPH to pass the project. My goal is to hit at least this much, with a stretch goal of 72 MPH. The current leader as of early Feb. 2018 has reached a maximum average MPH of 76.04.
Project assumptions and test plan
I started with the following assumptions regarding what might optimize for higher average MPH:
- The car needs to see decently far ahead to know what is coming up and how it needs to adjust. If the car can’t see the traffic ahead of it, it won’t be able to respond to it. My initial guess would be at least 2-3 car lengths, though more may be a smart bet.
- The car needs to see what is beside it to know what options it has. Seeing the action several car lengths ahead isn’t as valuable if the car is only seeing what is in its lane.
- The car needs to see behind it in case it is in danger of being passed. Hopefully, that should help to let the car make decisions based on the traffic it sees ahead of it.
- The more training iterations the better. The default is set to 10,000 iterations, but I decided to 5x it and leave it there. I’d like to have set the number higher, but for the sake of time that wasn’t going to be possible.
After trying out a few input combinations, I was able to achieve a maximum average of 71.93 MPH. I think that’s close enough to round up and say I achieved my stretch goal!
Some reflections from the project:
Data on data on data: It’s clear that even a basic goal like this requires a ton of data to see real improvements. My relatively small tweaks didn’t do much to change the average MPH, but my last attempt where I greatly increased the amount of data taken in from inputs and the number of training iterations finally resulted in a real change in the result.
Traffic avoidance: At some points, the car seems to want to stay in the left-most or right-most lane. I assume that part of this is due to the preference in its programming for avoiding traffic. When the car is all the way at an edge, there can only be traffic to one side of it. This may go back to one of the big points covered so far in the class: you have to be careful how you construct the system because it may find ways to optimize that aren’t realistic in the real world.
Constant optimization: When there is minimal traffic, the car will shift back-and-forth between lanes seemingly at random. This is fine when there is no traffic, but sometimes it decides to shift at the last moment into a lane with traffic ahead. I’m unsure of the reasoning behind this. I think if the cars were communicating with each other, some of this problem could be alleviated.
Overall the project was a really cool way to being to understand what goes into creating neural networks and the benefits/problems we have with their current implementation. It’s clear that even a “simple” model like this requires huge amounts of data to make real improvements so I can imagine what would be required to attempt to autonomously drive a car in the real world. It’s also clear why we’re still at a point where (most) human drivers will likely be safer on the roads right now. I’m excited to finish the class and see what else I can learn.