Hey, this is Brett, and this 2019 Ram 2500 Crew Cab Short Box Bighorn Level A Sport Appearance Group is stock number 14244Z. I am here at Summit Automotive in Fond du Lac, Wisconsin. You're new and used heavy-duty truck and, of course, Ram headquarters. This 2019 Ram 2500 comes with the 6.7-liter Cummins diesel engine. It's paired up with the 6-speed 68 RFE automatic transmission. This truck has been fully safety to and inspected by our service shop. It has a fresh oil and filter change. All the fluids have been checked and topped off. This truck is 100% ready to go. Very clean all the way around, and that's exactly what I'm going to do in this video. Go all the way around inside underneath, start it up, take a look under the hood, and give you the most accurate representation that I can of the vehicle. Granite Crystal Metallics of Color. I shoot all my videos in 4K. If you like the video, consider subscribing to the YouTube channel. Click the bell notifications and get updates on the videos I do each and every day, as well as having access to one of the largest catalogues of vehicle and heavy-duty truck walk-arounds on YouTube. This one comes with the 20-inch polished aluminum wheels. They are in very nice condition, and it comes with Versatire MXT HD LT28560R20s, and these are, I would say, probably 50-60% of the tread left on them. Frame and underbody is exceptionally clean on this truck. This is a one-owner, clean title history, clean car fax out of Oklahoma. Front fender is in excellent shape. This one's really nice because it has the LED headlamps, LED running lights, and LED fog lamps. I will turn those on at the end of the video so you can see just how bright they are. You get the painted color-match bumpers with the Sport Appearance Group. Didn't see any major dents or dings on there. The grille is in really nice shape. It also has the 360 camera on it, and the hood is in really nice condition. I didn't see any major dents or dings on there. You do get the cab lights up top, and the passenger side front fender is just as nice as the driver's. No dents or dings on there. And the passenger side front wheel, no major scuffs or scrapes. Looks really nice as well. Granite Crystal, one of my favorite colors on the Rams, has a lot of metal flake to it, and you can see just how much that sparkles. And if you get close, there's actually some purples and blues and greens in that paint, so it's a really cool color. Paint itself is in really nice condition. As you go down this side of this 2019 Ram 2500, take note of how clean the body is, how reflective and mirror-like that paint is. I take these HD videos, so if you're far away, or even if you're close by and you just cannot make the trip down, but you're still interested in purchasing the vehicle, you can see the truck here, the truck, and have confidence in the vehicle that you're looking at before you even get here. So when you do get here, there's absolutely no surprises, and you can make a smart and informed buying decision from wherever you're at. Now, if this video helps you make that buying decision, or just make the decision to come take a look at the truck, let your salesman know that you saw the video that it was helpful and that Brett sent you. Back wheel is in excellent shape, and then I can keep doing these videos for our great customers all over the United States. Back tires have a little bit more tread than the front tires. I would say probably 60, 70% of the tread back here. And that frame and underbody, just like the front, very nice and clean. Very advantageous to get a truck out of Oklahoma, very little to no corrosion. Has all the remaining factory exhaust, so it hasn't been altered in any way. Lower rockers all look really good, and it does come with the factory painted black step bars. Passengers side box, no major dents or dings on there. You do get the LED tail lamps. Coming around to the back, you'll notice that you get the backup parking sensors. Full towing package, which includes the receiver hitch four-pin and seven-pin wiring. And the only thing to really disclose on this truck is there's one tiny little ding on the bumper there, but it does not hurt the performance of the truck. You get the big horn, Ram, and four lettering all chromed out. Tailgates in really nice shape. Comes with a very nice spray and bed liner. You also get LED bed lighting back here. Some side box tie-dongs. And you get the cargo cam up there. The bed's in really nice shape. Didn't see any major dents or dings on there, and you do get that bed liner going on to the tailgate, which is a nice feature as well. Coming around to the driver's side, just as clean as that passenger's side, no major dents or dings on the box. Very nice and clean, and for full disclosure of this back wheel, no major scuffs or scrapes on there. Down the rest of the side of the truck, cab and doors all look fantastic. You do get the heated fold-up tow mirrors. They have blind spot monitoring. LED side lights. 360 cam and directional signals. They fold up like so, and they fold in like that. Take a quick look at the back seats first. No major rips or tears back here. Looks really good. Does have the latch-child safety system. For any child car seats you may have, fixed glass rear window. Once again, very nice and clean. No rips or tears, smells very clean inside this truck. I don't think it's ever been smoked in. You get a load floor back here, muddy boots or tools. Put them on there. You're not going to get your seats dirty. Or if you've got pets, you can put both sides down and then you have a nice flat place for your pet's delay, and they won't get your seats dirty. Get a couple extra bars in here and then nice storage area underneath. They also have all-weather floor mats back here with in-floor storage with removable bins for easy cleaning. You can put ice and drinks in there. It's like you have too many coolers wherever you go, or if you're not in Wisconsin, just extra storage space. There are airbags and child safety locks on these back doors. Inside and bottoms of the doors look fantastic. I'll show you the VIN sticker here. No Canadian trucks here. Then you've got the tire and loading information sticker right there.  No rips, no tears on these seats. They are in fantastic condition. Very nice and clean. Power driver seat with lumbar. You get the all-weather floor mats in the front as well. Auto headlamps, power pedals, power windows locks, mirrors, cloth bolster, wood grain trim. These mirrors do power fold-in. I always like showing both sides so that you know that both sides are working properly. Then the other neat thing is that they have the power blind spot mirror. You can see that outside mirror. I can control with the buttons right here if you press that button first and then which mirror you want to control. Nice system especially for the passenger side mirror. Hop inside, check out the miles radio and everything that this truck has to offer on the interior. You can see this one has 41,255 miles on it. You do get the digital speedometer on there. Instrument cluster is very nice and clean. Comes with the multifunction steering wheel. No rips or tears on that steering wheel. Cruise controls and gear selector on the right Bluetooth and information center controls on the left. Audio controls on the back of the steering wheel. There's your shifter for that 68 RFE automatic transmission. You do get the 8.4 4C radio. You get AM FM and Sirius XM radio capabilities on here. You get all your different apps including your cameras on there which we'll check out in just a second. This one also has projection manager. You can project your cell phone to the screen via Android Auto or Apple CarPlay. So if you have a nav system on your cell phone projected to the screen it's like you have nav on the screen which is pretty helpful because this one doesn't have the factory navigation system. We actually did a demo with Android Auto to see how that system works. That's in the upper right hand part of the screen if you want to check that out. Here are all the cameras though. So a lot of stuff to go over here. You have the 360 camera right there. This is a rear view of what's behind you and over your receiver hitch. You have a wide view of that as well. A wide view of the front. A narrow view of the front. And you can check out what's going on in the bed of the truck. That's your cargo cam. Which goes down the sides of the back of the truck. So if you were backing up a camper or boat or trailer you could zoom in on which side you were backing up to. And that would be just so helpful when backing up a camera. So really a nice system. Down here are your more tactile volume tune and climate controls.  Down here are your two USB's two USB C's and your AUG's jack. And down there you get a 115 volt 400 watt plug-in. And just going back to this camera here you can also zoom in on your receiver hitch to get hooked up to your boat camper or trailer the first time every time. You get your sliding cup holders and coin tray holders there. Keyless entry with remote start. Excellent condition as well. You do get those dual gloveboxes and the headliner is very clean in this truck. Once again, I don't think this truck's ever been smoked in. You get map lights up there auto dimming mirror and your home link buttons for your garage door security systems and lighting systems. Let's start it up take a look under the hood and check out all those LED lights in the front as promised. Starts right up. No check engine lights or anything like that. I would personally like to thank you for checking out the video today. And hopefully from this HD video you've been able to verify the quality condition options and of course cleanliness of this truck all the way around inside and out. Those lights are super bright. Cab lights up top working well too. Under the hood we have the 6.7 liter Cummins diesel engine engine base very clean runs very smooth. Once again this truck has been fully inspected by our service shop. Has a fresh oil and filter change all the fluids have been checked and topped off and this truck is 100% ready to go. There's the emissions sticker.  And I would highly recommend this truck for make quality and condition standpoint. Very clean underneath very clean inside very clean all the way around and whoever gets this truck is going to be very happy. And to see more pictures of this truck or one of our 550 new and used cars, trucks, SUVs, minivans, Wranglers, halftones, recorded tons, one tons. You name it we got to go to the web store right there, summitaudra.com Full pictures and descriptions of every single vehicle all at summitaudra.com. If you'd like to check out more HD videos you can go to youtube.com slash summitaudra. Click the bell notifications to get updates on the videos I do each and every day. As well as having access to one of the largest catalogs of vehicle and heavy duty truck walk rounds on channel the upper left. A link to all the Ram 2500 truck videos I've ever done in the upper right. A link to this vehicle on our website on the lower left and a link to one of our latest YouTube videos on the lower right. Click those, check us out. We're super excited to help you with this ultra clean 2019 Ram 2500 crew cab short box, big horn level A sport appearance group in veranic crystal metallic. Thanks again for checking out the video. Remember to like, subscribe and share on the YouTube channel. I really appreciate it. Thanks again.


You can help a child understand that shapes can be split into separate shapes by helping them fold paper. To start, you can cut out a square of paper. Then you can help the child fold the paper in half, vertically like this. You can ask the child, what shape did we turn the square into? And they can say, a rectangle. Then you can have the child open the paper back up, and you can point out the line they just made with the fold, and how it splits the square into rectangles. You can ask, how many rectangles do you see? And they can count, and say, two. Then you can work together to fold the paper in different directions, and see what shapes it makes. For example, you can help the child fold the paper in half horizontally, and they may see that it is also a rectangle. But when they open the paper back up again, now they may notice that there are four squares. Or, you and the child could fold the paper diagonally to make a triangle. You could even have them fold it in half again. Then when they open the paper, they can count how many triangles there are. This activity helps a child learn how shapes relate to one another, and that one shape can be divided into many different shapes.


Let me talk about deep learning with Python TensorFlow. This is a fairly high-level talk, so I don't want to maybe offend some of the deep learning experts in the room, but I'm going to kind of keep it fairly simple. But I kind of try to go into an explanation of what TensorFlow is doing under the covers and what deep learning actually is so that you can get a better idea of what's going on. So just as an introduction to myself, and I was told to give details into my background. So I'm a developer advocate, so you can kind of take that. You can parse that any way you want to. I know you're machine learning people, so you can either think of it as developer being the subject or the noun there. So either I'm a developer who advocates or I'm an advocate for developers. So either way, I have a developer background, so I was a Python engineer before I joined Google. I became a developer advocate, but I'm still a developer in the sense that I still built lots of things, but the focus is different. It's more about enabling other developers to do things. I'm based in Tokyo, Japan, so if you're ever out there, you can kind of catch me up. But I also travel a lot to Asia, so I'm in Singapore, and India, and Taiwan, and places like that are pretty often. You can follow me on Twitter and Google+, if you're into that thing. I don't post there, so don't do that. So as a background, I'm a Python person, but I also recently have been doing a lot of go. This is an image that was created by a Japanese guy who does a lot of really cool go images. I think the best one is the one raising Japanese onsen. And also I do a lot of Kubernetes related stuff. So if you're into containerization and things like that, come talk to me later. So deep learning, kind of 101. So deep learning is something that people say a lot of, and it's kind of a buzzword. But what does it actually mean? For me, it's a type of machine learning. So machine learning is kind of like if you draw the Venn diagram, right? Like machine learning is this big circle, and then deep learning is this kind of circle that's inside of it, right? So deep learning is a specific type of machine learning where you actually create neural networks. And neural networks are not just neural networks, but actually deep neural networks. So I'll be talking about neural networks in this and do a little bit of demo, but it's not particularly deep. But I want to get that over to you that you actually, in order to be doing deep learning, it actually has to be deep. But so what are these neural networks and what are they good for? So one of the kind of classic problems that neural networks are really good at are there's really two main problems. One is classification, where you take some input and you put it into one of the number of buckets. You say it's either A, B, or C. What's the probability that it is A, B, or C? And then the other one is regression, where you basically create a formula from the input. So you say you get some input in and you train it on some data and you get a formula out that kind of describes the data or allows you to kind of make predictions on the grid data based on the formula. So just to kind of give an example of what these kind of neural networks are, let's look at a couple of problems. This is the playground.tensorflow.org website, which is a kind of cool little app that you can play with. But it has a couple of little data sets here and these are like orange and blue little dots in the data set. And what you want to do is you want to have, you want to create a neural network that can classify this one. Is it blue or green or blue or orange based on if it sees new data, can it classify it as blue or orange? And three out of the four of these are pretty boring. So if you take this one here and you just, without even creating a neural network, do you just take the inputs and train it? You can actually have it solve the problem.  The same thing kind of goes for this. Like if you use the right type of inputs, like this is X1 times X2, then you can just straight up create a very simple way to classify the images. So if these are the type of like classical creation problems that we had to solve, we would never need neural networks, right? We would just draw lines down in the middle of these plots and we could classify things one or the other based on these lines. But what if you have something that looks like this little spiral here, right? It's a spiral, but once it hits the middle, it changes into orange. So these orange ones, orange is on this side of the spiral and then blue is on this side of the spiral. Like no matter what kind of inputs you give it, it's not gonna be able to actually figure out what the input is, right? So even something like this, where you have the orange on the outside and the blue on the inside, if you give it the right input data, it can actually solve it by just drawing a circle. But with this one, you can actually, you can't actually, it can't actually figure it out. Like it will never actually converge on the right answer. So what we need is we need something that will give us a kind of a way of solving the problem. And so we can do that by like having these neural networks and what you do is you give it these inputs and at each part of the neural network, we can solve kind of part of the problem, right? So like here we can say, take these inputs and say, okay, we're gonna create some kind of an image that looks like this and then we're gonna test it to see if it's kind of right and see how good it is. And then based on like how good it is at solving the problem, we're going to change these little weights that connect this particular node in the network to the other nodes in the network, right? So when we do that, it kind of is able to come up with a reasonable approximation. So this may or may not actually converge. Let's see if I give it a little bit more, give it a little bit more help. These take a little while to figure it out, but essentially what it's doing is it's trying to solve a little bit of the problem at a time and then eventually it will come up to come up with a solution that combines like all of these values into a final solution. And here it's actually getting kind of clever because you can see like some of the gaps here. It'll classify as orange even though they're not really necessarily orange, which means it'll probably not do really great on, that's actually a little bit of overfitting right here. But you can kind of see that this is something that neural networks can potentially solve. So what is a neural network? So a neural network is essentially a type of way or a way of taking the input data and then getting the classification out. So what we have here is we have say like an image, maybe a cat image. We change that into kind of an array or a set of inputs, which then go get sent into these layers in the middle. The hidden, these are hidden, what's called hidden layers, or the actual meat of the neural network. And those will have what's called an activation function where the inputs are then transformed in order to get to move it to the next layer or to the output. So this is, I'll talk a little bit about what these will actually do later and what these inputs actually are. But you can think of neural network. It's like neural networks are loosely based of how the brain works. So if you imagine that each part of your brain has a neuron that's connected to another neuron and you form memories and do have pattern recognition based on how strong the connections between the neurons are, each one of these different sections or these different layers have what's called a weight, which then kind of weights the connections between them. But from an actual computation point of view, you basically take an input image and what you do is you transform that into what's called a tensor. And then you perform operations on it at every step in the neural network and then eventually get out the output. And the output is also in the form of a tensor. So what you're doing for this whole thing is just basically doing operations on tensors. And that's kind of a reason why you get the name TensorFlow because you're basically like having this big flow graph of tensor operations on tensors. So I mentioned tensors, what are tensors? So tensors are a kind of an abstraction or a very generic way of saying a matrix. So you can think of something like a vector in computer science as being just an array. Or if you have a matrix, it's like a two-dimensional array. But a tensor is something that is n-dimensional. So it can be any number of dimensions. So see, a matrix is a type of tensor, a vector is a type of tensor, but you could also have like a thousand or 10,000-dimension tensor. This is also perfectly fine. And what's interesting about these things is that matrix operations, let's say matrix, when you do matrix multiplication, you all did that in high school, right? Do you guys remember how to do matrix multiplication, by the way? Who does? Who remembers how to do it? You do. Well, that's more than I thought. You don't remember, I know you. But anyway, what you can do with matrix multiplication is you can, that same method for doing multiplication, actually generic is, it can be genericized or like can be actually done on tensors as well. So you can do things on, depending on the size and the number of dimensions of the tensor, you can multiply that if the dimensions and the number of, and the size of the tensors are right, you can actually multiply it against different types of other tensors. So this is what actually the multiplications look like. So when you have an input, say this x1, x2, x3, that's essentially a tensor. In this case, it's just a vector of three values. And then you apply the weights. So this is the weights between each of the nodes in the neural network. And that's also a tensor. And then this B, this is the biases. So this is actually something that's trying to correct for overfitting or things like that are some bias in the original data, in the training data. But what you have here is you're basically just doing a matrix multiplication on the weight. So the weight is actually stored as a tensor as well. And then added, matrix added to the biases.  It's not very meaningful to you or to a person. It's gonna be numbers like 120, 37 and 50, you know? But what you really wanna know is like whether the input actually fits into category A, B or C here at Y1, Y2 or Y3. And so what we do is we apply the softmax function, which will then bound the end results into a value that's between one or zero. And that will give me a probability that it fits into a particular bucket. So each one of these Y1, Y2 and Y3 values are ended up being between one and zero. So you'll get something like 70% in Y1, 3% in Y2 and 1% in Y3. So you can essentially say that this, the input fits into the Y1 bucket. So that's how the neural network, how you would actually send data through the neural network. So if we're saying if we know the weights and the biases are ready and we send some data through, we'll get an answer out. But that's like when we already trained the neural network, right? We already have the weights and the biases set up to work. But we need to actually figure out what these weights and these biases are. And that's what we do with training. So this is kind of a flow graph. You can't really see the actual, the text here. But what it's essentially doing is this, you take some input and then you put it through a couple of layers in the neural network. So up until the middle part is actually just the prediction part. So it's actually doing the prediction steps that I talked about earlier. But then what it's doing at the end is it's using what's called an error function or a lost function. And what that is, is it's taking some training data. So I say, here's my input. I know it fits in the Y1 bucket.  So maybe it says that they're all equal or something like that. In that case, what we wanna do is we wanna take the difference between what we expect it to be and what the neural network actually gives us. So once we take the difference, or essentially the error in this case, and there's a number of methods that you can use to get the error. In this case it uses cross entropy and that's a common one. But you basically take the error and then you use that error to then correct the weights and the biases that we have set up earlier. So these like, what we do is we take a, using what's called a gradient function to then move the weights and the biases in the direction that's actually gonna give us the correct output. And this is actually, there's a lot of math involved in this but that's essentially what it's doing. And so each iteration through the neural network as you're training will actually inch each, the idea is that you inch the weights and the biases closer and closer to giving you a correct value. So that's kind of like an overview of what the neural networks do and what they, and how you're training at kind of a high level. But why is neural networks or why are machine, why is machine learning even an interesting topic nowadays? Like you see it all over the place and in lots of meetups like this one and people are talking about TensorFlow, this and neural networks that like, so why do people care about this? So one of the reasons why people care about this is because I think of a number of breakthroughs that have happened in machine learning recently. And these are led by a lot of people at Google and other companies but what it essentially means is that we've actually been able to use machine learning to actually solve some interesting problems. So some problems that people actually care about and that can actually use up until recently, like we've been able to use machine learning and it's been great and interesting and all of that stuff but we haven't really been able to make it into a product or into a thing that people can use every day. It's been mostly academic research and things like that. So the reason why I think that people use that have been caring about it is because of these kind of breakthroughs recently. So this is an image of the inception model that Google uses for things like classifying images and adding tags and labels to images. And this is, you can think of each step in this as a layer in the neural network so you can see that it has, I think something like 100, like no I forget, it's actually like 60 something, I think blocks here. And it's, so you have each individual layer that breaks off into other layers so you actually have this huge flow graph, right? And so each one of these is actually kind of a matrix multiplication. If you remember from the maths, matrix multiplications are like, you have one value and then you times that to like every other value in the other matrix. And if you have something like a 10,000 dimension vector or array or tensor, you can imagine how many times you have to multiply values together. And each one of these is a matrix, like multiplication and addition or something similar. And you can think of, like say you have an image that's like a megabyte big, you can imagine how much computing processing that would actually take to actually go through this whole graph and then get some sort of output. And then you have to do that millions and millions of times to actually create a graph. So one of the other things that's really interesting about neural networks recently is also that they've been able to scale in the sense that if you give it more data, it actually learns and gets better at, has better accuracy. So recently, up until recently, like we've been able to do things like medium neural networks and small neural networks because the processing for large neural networks was actually too much. It was too resource intensive for us to be able to actually do it. But recently we've been able to actually start parallelizing that and making that easier to compute. And so we can actually start training these large neural networks or actually building these large neural networks and proving that they can actually scale as you get more and more data. So in terms of the breakthroughs that I'm talking about, like we're talking about these large neural networks. Like when you have medium and small neural networks, these are great unlike kind of an academic level, but you can't actually create something that people can use every day.  It's still something like just adding little labels to images, but with medium and small neural networks they're just not complex enough or not good enough at solving these kinds of problems. So one of the things that is important for creating these large neural networks is being able to use things like to do these complicated computations. So you need to be able to do these in a reasonable amount of time. You don't want to be taking like months and years to actually train your neural network. So things like GPUs are great, but in order to do anything like really interesting, you need something on the level of a supercomputer. And it's not really many people have access to supercomputers, I know I don't personally. So a few GPUs will help you, but you have to wait hours, days, or even weeks for your output to come out. And maybe a supercomputer can help you with that, but that's not something that people really have access to. And even at Google, we don't really have access to supercomputers in the traditional sense. By the way, do anybody have access to a supercomputer here? Usually somebody does at these kind of meetups. I've gotten a few hands, nobody, okay. So some of the things that we've used, this kind of thing for at Google is to like label images. So talks a little bit about taking the text out of the images or identifying where a text is in images.  And at Google, you know, this is a graph showing like how much, how many projects within Google are actually using machine learning. You can see that from 2004, there's like this kind of hockey stick, kind of growth graph. And that's basically because of all of these kind of breakthroughs that have happened recently. So coming back to TensorFlow. So TensorFlow is essentially what is a kind of a second or third iteration of the library that we use at Google to do machine learning. So previous to this, we had a library called Disbelief that we used to develop machine learning algorithms. But it wasn't terribly flexible. And we also wanted to create something that was open source and we could build a community around. And so that's why we released TensorFlow. And what it is, it's just a generic library for doing machine learning, not necessarily neural networks, but that was the first thing that we really added support for. So what it is, is at kind of a high level, is it does all the things that I said that you need to do for neural networks. But what it does is it actually creates this kind of flow graph, so that each one of these little layers becomes a generic type of part of a flow graph, which then can be computed on a device. So something like a CPU or a GPU. And those can be maps kind of independent of the actual operations that you're doing.  TensorFlow kind of takes care of all of that for you. And it does other things, like being able to distribute the work onto multiple GPUs or multiple CPUs or a combination of CPUs and GPUs and that sort of thing. So some of the core TensorFlow concepts and structures are graphs, operations and tensors, like these are just essentially classes that you can use in Python to create your TensorFlow models. And then there's other ones like constants, placeholders, variables and sessions. So the constants are what you'd expect. Those are constant values. Placeholders are values that are inputs into your neural network. And then variables are things that are modified as you're actually training the model. So the weights and biases, those type of things will be variables. So as you're training, those will get updated. And then a session is basically just encapsulates like an environment. So a single run through your training steps. And then TensorFlow supports a lot of operations. This is a totally non-exhaustive list. But you know, like these are types of MIATH operations you can do on tensors, like multiplication, division, subtraction, that sort of thing. So what I want to do is we're gonna do this live. I'm going to start up Jupyter here and come on through creating a TensorFlow model. So this is like a really, really simple example. But it kind of helps illustrate, that's too big, that's all right. Let's clear this. So this is going to be an example. And I'm really glad that the previous talk was all about how to pre-process images and things like that, because this particular demo or this particular example is also an OCR. So MNS is a really popular or really a well-known training set. And what it is is it's just a bunch of handwritten numbers that we're then gonna do OCR on to actually figure out what number is actually written there. But all the data is totally pre-processed and everything. So you have like each individual care images is a single number.  So I'm glad that the previous talk was all about that. So what I'm gonna do is like just load the data. So what this is is just basically 55,000 images of handwritten numbers. And this is already kind of parsed into a format that's good for inputting it into the model. So kind of everything that you can kind of take everything from the last presentation up until the point that we actually put it into TensorFlow.  But what you end up getting here as input into TensorFlow is let's just run all above. So here what we have is we have this, these are, this is the training set of images and we have 55,000 images and they're all 784 values big. And what 784 is is basically what it does is it takes the image which is 28 by 28 and it creates a single basically big long array of 780 values, 784 values. And what those values are is basically a value of zero to one based on how dark the pixel is. So if it's kind of a light pixel, it'll be like 0.23 or if it's a pure white pixel, it'll be zero or if it's a very dark pixel, it'll be like near one. So you can kind of see what the factor, the tensor looks like. But it's basically a big single kind of vector. And then let's see, give me a second. So here we actually train the network or we create the neural network here. So this is actually setting up all of the values. So here we have the placeholder which is our X input tensor. We can see that it's 784 big and then we're giving it none here because 784 is just one image and then we can have like any number of images in the training set as input. And then here this W and V are the weights in the biases because like what we're gonna be doing is just creating a neural network that just has a single hidden layer. And that one single hidden layer, we have these W and V as the weights in the biases. And then what we're gonna do is do exactly what we did what I showed earlier which is we're gonna take the input and we're gonna do a matrix multiplication on it with the weights and then add the biases to that. And then at the end, we're gonna do a softmax which is gonna give our output. And then here's where we actually do the training. So here we're gonna do this Y prime is basically our kind of training data. And so that's gonna say, this is the exact same format as we get out of our neural network. So when we get out of our neural network, we have a value or a tensor that's basically a single vector that's like has 10 values in it. So those 10 values correspond to the 10 buckets that it can be in. So if you get a single image and there's a one, it's an image of a one, then we have the output of our neural network is going to be the probability that it's a zero, probability that it's a one, probability that it's a two, and so in our 10 size vector that we get out. And then our training data is exactly the same as that except we know exactly what the number is in the training data. So the number that it is, if it's a one, then it's going to, in the place where it says a one, it's gonna be 100%, so there's gonna be a one value and then all of the other numbers will be zero. And then we use that, we input that into cross entropy in order to, or we create this cross entropy function in order to actually do the loss and then we do a gradient descent on it in order to actually optimize for the training step. So it's a little bit difficult to visualize, but essentially what you're doing is you're taking the diff and then you're doing this kind of gradient descent thing where you're taking a value, if your difference is really high, then you're modifying the weights in the biases so that they, so that you move in a direction that's gonna give you a better value next time. So here when you get kind of a bad value for cross entropy, you kind of say like, well, if I go in this direction or if I modify the values this much, it'll probably be okay, but you don't really see this whole kind of plane, I guess. You see just an individual part, so it's kind of like walking down a mountain with a flashlight. You can kind of, as long as the slope is going down, you can kind of find your way, but you could hit local minimums if you're not careful, if you're using that kind of algorithm. So once we have the training step, we can actually do the training. So here we have, we're basically initializing all of the variables that we set up earlier and creating our ascension and then running the initialization of the variables and then actually doing, running through 1,000 times to train this particular set. And then what we're doing is we're taking this training set and the training set we noticed was 55,000 values, right? So what we're doing is not going through 1,000 times and then each time training on the 55,000 values, we're actually picking a batch of randomly each time, we're picking a batch of 100 out of those 55,000 to train on. And what this does is actually, if the training data is reasonably random, we can actually just do a random sample and you get very close to an output from your neural network or your training will work pretty much the same way as if you trained on the entire data set. So it's kind of like if you're polling, say like everybody in America or everybody in Singapore to figure out who the next president should be, you can kind of basically take a random sample of everybody in Singapore and ask them who the next president would be and the next extrapolate that into all of Singapore. And that's kind of what we're doing here. It's basically taking a representative sample from the training set to actually train on and then run that. So then that will actually give us our kind of proper weights in the biases. And then at the end here we can actually just, we can actually train the, or test the prediction on a test set. So the test set is exactly the same as the training set except we didn't actually train on it. So the training, so the neural network has never actually seen the training set or this test set, I'm sorry. So you're basically what you're doing is you're testing it on data that the network hasn't seen yet to train it, check its accuracy. And we can see here that it's about 92%. So it's actually pretty bad, but this is kind of a very good way of kind of visualizing and stepping through what an actual neural network is doing. So one of the things that I didn't talk about earlier was that because we're actually talking about a single hidden layer in here, you can actually kind of visualize the way that this particular neural network is training by looking at the probability that a particular pixel is black or is dark, how it influences the output of the neural network. So in this case, you see if these like in these blue areas, if there's a dark pixel in those blue areas, then it's going to be highly likely that that's gonna be a zero. And the same thing for a one and a two and a three. And you can kind of see that these blue areas kind of show in the pixel or in the image where the dark pixels would likely be. And so you can kind of see that it looks kind of like a seven or kind of like an eight or kind of like a nine. But this is like a really, really simple example. So who can tell me like why this would not be a really great way of figuring out whether a number is right or not? Or whether a particular image represents a particular number or not? Anybody have any ideas why this is a bad way of doing it? No? Everybody thinks this is good. One in 10 images, like one in 10 is like coming out wrong is okay. So how about if we take this zero and we like move it a little bit, like, you know, say five pixels or six pixels to the left, like what would happen then? You know, in this particular example, like you would say this particular neural network would not really actually give you a very good output. It would, some of the pixels might actually go or the right side of the zero might actually go through the middle of this big red section of this particular image which would negatively correlate with it being a zero. And so that would cause it to have a very, you know, high false positive rate. So in this case, you actually had me to do a little bit more to actually get good or higher accuracy for these type of, you know, doing this type of OCR work. So one of the things you can do is like actually make it more, make your neural network deeper, right, so by making it deeper and like adding extra kind of layers to it, you can actually make it, be able to deal with these type of problems a lot better. So one of the ways of building multi-layer networks is a common way is to build a convolutional network. And building convolutional networks are very, are a little bit more complicated and so they require a little bit more time to explain than I have. But I'm going to kind of go over it a little bit and tell why it actually does a better job of for images that are kind of skewed or moved to the side a little bit. So one of the things that this particular example will do once we, when you do the convolution is you can go over the image kind of one pixel at a time like and create a new image. In this case, it's a nine pixel image based on these kind of sliding windows of the original images. And then, so that's the actual kind of like convolution part and then you can then this is like where we create a convoluted feature, a convolved feature. And then do some other like max pooling. So in this case, we're taking these also these parts and then doing a two by two filter. I can't remember exactly what this was doing but there's the convolved duty and then the adding these max pooling allows us to convolve the image into like kind of an easier image that will correspond much better to our actual number. So in this case, like what you'll get out is like this, even if the image is like the zero or the one or whatever is slightly slid to the left or the right, the this convolved feature will actually give us something that's kind of normalized with that kind of input. And then what you can do is after you do one convolved convolutional layer, you can do the same thing. You can create another convolutional layer on top of that in order to improve the accuracy of the normal network. So here we're actually like this is just basically, so you've reduced to the image to seven. So like we have you basically between the two different layers, you densely connect them, which means that all of the values from the previous layer are connected to the values in the other layer. The original example was also a densely connected as well. And then this does like a number of things like dropouts and creating readout layers in order to improve the accuracy, just a little bit beyond what I can talk about. But once you do these type of things, you can actually make this, you can actually improve the accuracy quite a bit. So this actually runs for quite a lot longer than the original example, but you can get up to about 99.2, which is reasonably respectable with just a two layer network. But one of the things that's really, really interesting about TensorFlow is that you can kind of find all of these in Python. So it's much easier to kind of understand and go through. And then once the, as you're building this, you can actually do things like use something like TensorBoard. So this is actually a no longer existing URL. But what TensorBoard does is allows you to like, every intermediate step kind of visualizes the inputs and outputs of the particular layers. So what you actually do is, here we go, like if I can blow this up a little bit, is you can kind of take these like this kind of TF or TensorFlow summary file writer and then kind of wrap your existing graph in order to have it write out log files kind of automatically. And then these can, those log files can then be, so in this case, he's taking the training step and the test step and writing logs for each of those. And then once you, you can run TensorBoard on the directory of logs that's output in order to actually visualize things like the entropy. So in this case, it's like the loss function. So you can see that the loss function is getting lower over time, which means that the accuracy should actually be going on. So these type of things you can kind of visualize and there's like a lot of really cool examples. So one of the things that happened also recently was the TensorFlow Dev Summit in San Francisco. So if you go to the website for this, if you search for TensorFlow Dev Summit, you'll come up at this website. And one of the things that they did was they recorded all the talks. So here's kind of on the top pages, this kind of marketing, TensorFlow, Magickler, Machine Learning for everyone, but you can see the videos from all the talks that were done. And some of these are very, very good. One of them that was really cool was TensorBoard and kind of creating custom visualizations and showing all of the things that you can do with TensorBoard. So that was one of the things that's really, really good. Because Jupyter and some of these ways to help visualize Machine Learning can only really go so far. So some of the things that came out of the TensorFlow Dev Summit was that TensorFlow is now 1.0 and one other thing that I thought was really cool was that there is a new project called TensorFlow Fold. And what this does is actually, it's a little bit difficult to explain, but kind of flattens an arbitrary kind of inputs into something that can be easily run through the existing TensorFlow. So something like, say, a sentence can be kind of flattened into a graph that allows you to kind of parse the sentence. So I thought that was pretty interesting. And this is something that you can kind of build and that works really, really well with TensorFlow. So you can do things like this one. They have examples for building only tree LSTMs for doing only sentiment analysis on text and things like that. And then kind of lastly, I kind of want to show the, or talk about some of the other features of TensorFlow from a little bit more high level. So one of the things that makes TensorFlow really cool is that the graph that it creates, it creates each step in the flow graph can be run independently. And so you can actually break the processing out and then run it on multiple devices, like multiple GPUs, multiple CPUs. And then those can be, technically, can be run on even other machines, like so you could have multiple machines in a distributed network that can be all doing the processing together. So there's a number of ways to do distributed training, but TensorFlow supports like several of those. So the main thing that the distributed training gets you is like I kind of mentioned is that you can schedule the individual pieces of the data flow graph processing to be run on CPUs or GPUs. And it will use things like RPC or RDMA for communication between those and for things like sending, when you need to send data over the network and does other things like kind of make sure that if there's faults or problems that happen during the training that it can kind of handle those. And it supports like several of the different things. So if you're kind of familiar with this, there's a couple of ways of breaking up the data or breaking up the problems so that you can run training steps in parallel. One is like model parallelism and one is data parallelism. So model parallelism, the idea is that you use the same model on multiple machines or you actually break up, sorry, this is the one where you break up the model itself and run different parts of the model on different machines. So in this case, you're just sending the data, you're using each part of the model, we'll see all of the data, but you're breaking up each different part of the model to be run on different machines. So if you imagine that flow graph, you can imagine that parts of it are run on machine A, parts of it are run on machine B, parts of it on machine C, et cetera. And then there's data parallelism where what you do is instead of breaking up the model itself, you break up the data, you segment the data into multiple pieces and then you use the same model on each of the machines, but you only train this set of machines or this machine using a subset of the data. And then at the end, you combine that. And then there's sub types, so here's just like sub graph or full graph for model parallelism or synchronous or asynchronous and there's several kind of trade-offs between which one is best and which one is not good. There's pluses and minuses to all of these. Just as an aside data, there are Google uses data parallelism for most of its processing or for most of its machine learning work. And then we do kind of a an in-between, go as an in-between between synchronous and asynchronous. So another thing that's kind of interesting about TensorFlow is it provides kind of a machine learning API that allows you to then kind of abstract away the actual hardware and things like that since you're running your computations on. So that allows you to use things like at Google we're creating something as part of Cloud Platform that's called Cloud ML, which will allow you to run TensorFlow graphs on Google hardware. So you can actually generate TensorFlow graphs and say, okay, Google run this on your hardware and distribute it whatever and have it worry about all of the hardware and latency issues and all of that stuff. And so you can kind of basically throw, use the existing hardware that we have for doing things like machine learning, but be able to have an interface that's not proprietary. So it's an interface that is open source and you write it and it will run anywhere but hopefully someplace like Cloud ML would be actually be faster and easier to use. It'll also let you use things like the dedicated machine learning hardware that Google is developing. So like one of those is like TensorFlow processing units. So these are essentially like GPUs but they use a lot less power and they're specifically designed for doing machine learning work. One of the things that's bad about GPUs is that they were originally designed as graphic cards and so that they consume a lot of power and that's when you put thousands of them in a data center that's actually costs a lot of money and generates a lot of heat. So we have these new hardware. So that's kind of an overview of what TensorFlow does. And so you can imagine other things like maybe even open source hardware for things like TensorFlow processing units or machine learning or whatever and then having people map TensorFlow operations directly to that type of hardware as well like even because it's open source. So that's one of the cool possibilities of for things like TensorFlow. So I think that that's probably enough TensorFlow and Cloud ML and stuff like that but if you're interested in learning more then check out TensorFlow.org. There's lots of really cool documentation here. So things like if you click on resources there's quite a lot of TensorFlow documentation here. So develop is where we wanna go. And then if you go over here to get started or a programmers guide this is where all the kind of cool documentation is written and it's really easy to follow. Also check out there's like, I don't know if this actually still works but yeah there's a cool TensorFlow workshop that you can check out. This is bit.ly slash TensorFlow-workshop or if you search for like TensorFlow workshop on GitHub you should be able to find it. So that's another really good resource for checking out TensorFlow and getting your hands wet and kind of taking the next step towards playing with this. So I hope that was useful and was it too dry and all of that stuff. So if you have any questions or anything like that then I'd be happy to answer them. That was a very enthusiastic hands up. So yeah, go ahead. Yeah. Do you want one by one or do you want any one by one? What's that? I have three questions. Okay. Do you want one by one or all at a time? Let's go one by one. It's a DPU on the Google Cloud platform for like under the business under the TensorFlow. So then do you want a few requests by now or why not you look at the open source DPU? So okay, so that's actually like, so first off I think we're gonna probably make it so that it works on Cloud ML first before it actually can be run just as a, are you talking about just on like a regular VM from a regular VM or something like that? Yeah, so I don't really know if that's like specifically in the roadmap yet for is there like, is there like a specific use case? Like, why wouldn't Cloud ML work in that case? Like, is there a specific use case that you want to run GCD on? That's it. I don't really want customers like me. Right. I'm only limited to Shuda and I only am formed to use NDDM. Right, so that's another question, right? Yeah, a lot of community have been asking why Google went and gave it to them and not have any support for EMV or even if it doesn't give you guys 15 BU, but why restrict us to only using NDDM? Okay, yeah, I mean that's like great feedback but I would probably argue that you would probably, that you would, that's using TPU outside of, like using a GPU makes a lot of sense because you can use it for not just machine learning but for other things like lack of processing but for something like a TPU, it's a very specific type of piece of hardware. So you could probably use something, like using the Cloud ML service would probably be fine for you rather than having to run, having it attached to a VM but we can kind of talk offline about that later. I don't want to use, because I'm on service, right? That's why I do not have Cloud ML on-premise. So what you said is I do get a watch, I mean I want to deploy and support internally because I'm on a data engineer, I don't know how to steer my model, I don't know how to audition. Right. How much do I talk to? Well, that's a good question. So there's a couple of like of, I don't have the links handy but if you like give me an email later I can send you some information about how to, there's a couple really good workshops on how to deploy TensorFlow in a distributed way on your own hardware and so I can kind of point you at that. So yeah, hopefully that'll work for you. So if you give me your card later I can kind of point you at that. Any other questions? Yeah. Does Google plan to provide any high-level library like Keras for configuring the neural network? Yeah, so that's one of the things that was interesting about the TensorFlow Summit. So one of the things that came out of that was that Keras was going to be one of the supported APIs for TensorFlow and it's actually going to be moved to the contrib folder within TensorFlow and it's going to be supported moving forward at Google. So for Keras specifically, in the future you should be able to use that for things like Cloud ML and stuff like that. I don't know about other libraries and how well those will actually work but for Keras specifically you should be good. And that the TensorFlow team is also looking at including and providing support for a lot of more high-level libraries. As you kind of noticed like TensorFlow is very kind of somewhat low-level in terms of actually creating a neural network. So things like Keras are much more high-level and allow you to create code that's a little bit easier to understand if a little less powerful. So TensorFlow kind of exposes all the knobs and sliders for you whereas like Keras is a little bit more gives you like kind of sane defaults and is a little bit better UX or a little bit better user experience. I'm going to go with you. We got to creating the neural network in TensorFlow. You add those hidden layers automatically by the machine or you have to add it for your own. So the hidden layers themselves are created by me. So you would end up writing those but when you actually train that's it updates the values to give you values that would give you the right outputs. But you can't just create a neural network automatically. You have to kind of know what each of the levels are supposed to need to do or what you're planning on doing for each of the steps. I think you had a question, Ian. You say the tradition is that TensorFlow is meant for neural network but it can do much more than that. What about other algorithms? Is it a super one for filtering? So I think, I don't know the status of these projects but one of them was like there was a project called TensorFlow Wide which is neural networks are deep. The other types of algorithms are applied anyway. So the idea was that you would have the, I don't get it either, but the TensorFlow Wide is basically a way of his part of TensorFlow that implements other types of machine learning algorithms that aren't neural networks. But I'm not really, I don't know offhand like the status of that project. I just know that that project exists. So if you're interested in checking that out, go look for TensorFlow Wide. Yeah. If I want to learn about TensorFlow, so I need to acquire your TPU. You don't need to, you run it on TPUs now. TPUs just make it run faster or more efficiently than running GPUs or CPUs. CPUs are the least efficient. But so if you just run like training on CPUs, it'll take a really long time. GPUs will give you a, you know, run it like 10 times or on an order of N, 10 times faster. So like probably less than 100 times faster but more than 10 times faster. And then, you know, TPUs will let you to run it a little bit faster than that. But hopefully more cost effectively. So the idea is that if you can run it on TPUs, then it'll be probably cheaper because it uses less resources and all that stuff than actually running it on GPUs yourself. Yeah, one more question. Is that okay? Yeah, yeah. For the parallelism, will it be like Apache Spark where the machine and the parallelism is somehow transparent to the user for the TensorFlow? So transparent to the person that writes the model. Yeah, to some degree. There is a little bit that you have to do but it's relatively simple. So TensorFlow generally will be able to map the, for the most part is able to map all of the operations to that stuff automatically. So from the user's point of view or for the person writing the models or writing the TensorFlow code, they don't really necessarily have to think about how many machines it's gonna run on and that sort of thing. And if you add machine nodes to the cluster, you don't have to change your code or anything, you'll just run on more machines and hopefully run faster. The problem with distributed training with things like that is generally that the network will bottleneck very fast. So you have to be kind of cogent to that. So it's not really that you can just throw in machines at it, generic machines at it. You have to kind of care about a little bit about the network. Once you get above like five to 10-ish nodes, probably on the word of 10, 15, 20, that type of level, you need to care about how many, what your network is like and how fast it is and things like that. But from a theoretical point of view, you can kind of scale it out as fast as you want, as much as you want. Do you mind if I take that offline? Because I think we're kind of out of time. Is that okay? All right. Is it okay? Okay, okay, we'll go ahead. Do you want to give them the 8D or the solution over there? For TensorFlow Fold? Yes. I think that it's the, I mean, I'm not, I haven't really looked at it too much. I just thought it was kind of an interesting product or an interesting project that came out of the Dev site. But I think that it's from what I looked at it, it looked like it was kind of a little bit separate from actually running the layers. So it was like, it was almost like a library for doing like this kind of like more pre-processing type of steps before you actually run it on networks. But I'm not really sure. So I could like kind of ask around and see if I can figure that out and get back to you if you have an email address or something. I live next to start a research in Singapore? You're asking the wrong person. I had no idea. You want to send your resume or something? Sure. What's that? You want to ask about it? What do you mean? Okay. Yeah, do you mind if I take it offline? For a convolutional network? You can have like theoretically any number of layers. So for the example that I did, I just did two layers. But you can theoretically do more layers. In this particular, in that particular example, I don't think that adding more layers would actually make it more accurate. But depending on the problem, if you add layers, it'll help with... Why I asked this question? Sure. I don't have a strange hand right now. So depending on the number of layers, if the thing comes on you to work and suddenly the thing just won't work, it will get broken and stuck. So it will turn out to be different. Yeah, do you mind if I continue that offline with you? So thanks to all of you for coming.


So the title of this lecture is, What's All This Good For? Okay, so I've been busy defining lots of spaces. I guess, I mean, that's what I did last time and the first time this time. So there's not going to be any proofs or constructions now. I'm going to, well, I'm going to tell you what people have been using these spaces for. So the most obvious thing, I mean, why did I make these spaces? I had these groups. Well, I started with the group of outer automorphisms of free group. Then I went on to the group of automorphisms and the group, these groups, ANS, which are kind of generalizations of automorphisms of free groups. So the most obvious, what I hope this was good for is learn about the groups, including. Okay, so the first thing you can do if you have a space, a nice space with a nice group action, especially if your space is the nicest, namely it's contractable with a proper co-compact action, is use it to find a presentation for the group. So Ken Brown wrote a paper showing if G is finitely, so you don't need that. You don't need anything. G acts on a space X, which is contractable. CW complex, you need a self-complex, proper action. Actually, you don't even need contractable. So I'm getting all you need is simply connected. CW, proper, co-compact. Then you can use that to write down a presentation for G in terms of the stabilizers. So you find a fundamental domain for your action. This is basically a generalization of Bass-Thur theory. Basically, you take your simply connected cell complex, look at the one skeleton. That basically gives you the generators in the quotient. And then you got these two cells, and they're going to basically give you your relations. So that was done. That's been done. So Armstrong used KN0, KN1, excuse me, to give a presentation for autofn. But actually, we didn't quite use KN1. We used because, you know, in order to write this down, you need to know all the stabilizers. And the stabilizers can get pretty hairy as the rank of the graph goes up, goes up. The stabilizer is basically the group of automorphisms of the graph, and that gets more and more complicated. But it turns out that inside here there is a subspace, which is also called KN1,2, which is also simply connected, not contractable. But it's simply connected, and the stabilizers are very tame. They hardly change at all when n goes up. So given this nice situation, we could write down a presentation for the group. So that's the first thing, maybe the easiest thing to do with a complex with a nice action. Your space doesn't even have to be all that nice, just simply connected. So then, okay, so now we have a presentation. So what can we do with the presentation? Well, you could draw a Cayley graph and all that. But the easiest thing to do with a presentation is abelianize it. These are not new results, incidentally. I mean, this presentation was new, had features that other presentations didn't have, but there had certainly already existed presentations for the group. And so in particular, abelianizations of the groups were already known. But the point is, let me just call it, this is in general. If you have a presentation, you can compute the abelianization. But the abelianization is only, so that's an invariant to the group. But it's only the first invariant in a long list of invariants, namely the homology of the group. So what is the homology of the group? Well, here's one way to define what the homology of a group is via a theorem of Harewitch.  There we go. Then the homology of the quotient space, x mod g, is an invariant of g. So it doesn't matter what kind of a space you have, as long as it's contractible and g acts properly. You get, when you compute its homology, you get a group invariant. The first homology is the abelianization. And this is one way to define the homology of a group. There are other, more algebraic ways, but this is a fine definition. So we have contractible spaces. So I told you that algebraic topologists liked contractible spaces with proper actions. They didn't really care too much whether it's co-compact, and this is the reason. If you're interested in the algebraic topology of these groups, then that's all you need. So it can use, yeah. Whoops, nobody stopped me. Even the people that should know. What did I say? I forgot to say something. And in fact, this is wrong. Stabilize your information? Yeah, I said properly. I heard it, somebody whispered it. This is only true if g acts freely on a contractible space. Then the quotient's an invariant. That's only true. We don't have a free action. But it turns out that Baumschlag and Taylor conveniently proved that, well, in fact, what they proved implies that all of the ANS has torsion-free subgroups of finite index. So if the stabilizers of the action are finite, and this group doesn't, so a subgroup certainly acts on the same space as ANS does, and if this doesn't have any torsion and the stabilizers are finite, then this group acts freely. Gamma is the homology of KNS modulo gamma. You can also define co-homology. Okay, that's nice, but we were kind of... Gamma. That's gamma. I've got a torsion-free subgroup of finite index of my group. My group acts properly on KNS. So gamma acts freely. So I can compute the homology of gamma by using this space. So that's nice. I was really kind of interested in the whole group ANS, though, but all is not lost. So remark. If I have a finite group H, and I look at its homology, or co-homology, and instead of using Z coefficients, I tensor the chain complex with Q, then I get the homology of H with Q. I want to use reduced homology to make this a cleaner statement. Turns out that's zero. HI is zero for all I. So heuristically, you can think that if I'm willing to use homology with rational coefficients instead of integral coefficients, then I can't tell whether my group is acting freely or properly. The stabilizers, as far as the homology is concerned, are the same as trivial stabilizers. So in fact, you can make this precise. This implies, eventually, that the homology of these groups ANS with rational coefficients is actually isomorphic to the homology of the quotient space with rational coefficients. So I lose some torsion information, but I still get information about the homology of my group, at least with rational coefficients. And so the proof of this, I mean, this is an easy spectral sequence argument that I'm not going to subject you to. So if you feel like it, you can sit down. And if N and S are small enough anyway, you can figure out exactly what this space looks like, exactly what the quotient is by the whole group, and figure out its homology. Right. That's correct. Is the homology of ANS with rational coefficients related to the homology of gamma with rational coefficients? Of gamma? Not directly? No. But we needed gamma to be able to do this argument somehow. In order to get the actual co-homology, a space whose actual co-homology with integral coefficients is the same as the homology of the quotient space, you need a free action. But if you're only interested in rational coefficients, then the homology thinks the action's a free action. So you can actually compute rational homology. Right. I still have a board up there somewhere, and this brings me to... So it turns out that the homology of these groups is very mysterious. Nobody really understands it at all. But we do understand something about the Euler characteristic, at least as of a week ago. We'll actually be understood longer anyway. So I just want to tell you something. I've been talking about stuff that started in 1920. We finally moved up to 1970 and then up to 1990. I want to tell you something from last week. Okay? So homology. So for a finite CW complex, X, we have an Euler characteristic. Minus 1 times the number of I-cells. And another way to compute it is taking the sum minus 1 to the I of the dimension of the homology of the space with trivial rational coefficients. If I was going to use integral coefficients, I would have to say the rank of the homology. But I'm using trivial rational coefficients, and I can say the dimension of the homology. That turns out to be the same thing. So, right. I know the homology of A and S with rational coefficients is the same as the homology of that quotient space. If I take that space, then I get the sum minus 1 to the I of the dimension of the homology of A and S with rational coefficients is, yeah. I compute the Euler characteristic of X is that number. So that gives me some, if this number isn't zero, for instance, it tells me that there is some homology, which is not a priori clear. So this is an interesting number, the Euler characteristic of this space, that people have been trying to compute. So I got up to Sakasai, Merida, Sakasai, and Suzuki computed this for n less than or equal to 11. That's as far as the computer would go, and that took a couple of years. Yeah, so it's negative, and n equals 11, it's about 1204, 1200, somewhere around 1200. So apparently there's lots of rational homology. On the other hand, so far in all the computations that have been done, there's exactly one. There's lots of homology, and this is a negative number, so there's lots of homology in odd dimensions. At this point in time, there's exactly one homology class in odd dimensions that's ever been found. So there's lots of stuff hiding, we don't understand, we can't find it. It's, yeah, there's an open question for you, where is all of this homology? But it turns out that this number, this sum of this number here is not actually such a good invariant of groups. So one nice thing about Euler characteristics is that if you have a vibration and everything's a finite CW complex, then the Euler characteristic of the total space is a product of the Euler characteristic of the fiber times the Euler characteristic of the base. So if you wanted to find some sort of an Euler characteristic for groups, you'd kind of like to have the same sort of a feature, so instead of a vibration instead you would think about short exact sequences, kernel, group, and quotient. You would like it to be true that the Euler characteristic of the group is a product of the Euler characteristic of the kernel times the Euler characteristic of the quotient, but that doesn't do it. The definition left is not multiplicative, but Wall said he fixed that. He said if G contains a torsion-free finite index subgroup, let's define the Euler characteristic of G to be the Euler characteristic of gamma divided by the index of gamma. Now that kind of makes us happy because we know how to define the Euler characteristic of gamma for a torsion-free finite index subgroup is just the regular Euler characteristic of a space that we know more or less. So it turns out that this is independent of the choice of gamma and behaves well with short exact sequences. But yeah, so we could try to find some subgroup of finite index of our ANSs and compute this Euler characteristic there and divide by the index and we'd get a number. It turns out that Brown comes to the rescue, says you don't have to do all that work. If you have G acting on X, like up there, X is contractable now, properly co-compactly, then the Euler characteristic of G, as defined by wall, is the sum of minus 1 to the dimension of sigma divided by the order of the stabilizer of sigma and this is overall orbits of cells. So that means we don't have to bother with this subgroup of finite index and trying to compute this Euler characteristic and dividing by the index. We can just look at the action of G on our space. So in the definition of wall, the chi of gamma is using the previous? Yeah, either one works. Yeah, chi of gamma is, that's just the regular, yeah, usual definition. So it's just the Euler characteristic of that quotient space. I love it because being quotient free means, you know... Got a nice... Yeah, you have a space that actually computes the homology of the group. If gamma isn't torsion free, we don't have a space. I mean we have a space but it doesn't compute the homology of the group. It just computes the rational homology of the group. And that's not good enough, it turns out. Okay, so yeah. So I just want to advertise a recent result. I started at 4, right? Yeah. So anyway, John Smiley and I in 1987... Not too recent... ...used this to get a recursive method of computing the Euler characteristic of out of fn. And we did it for n less than or equal to 11, in fact. And for n equals 11, it's approximately, I think, 2,000. Minus 2,000. It's a rational number now, it's not an integer anymore. It's a rational number, it's approximately 2,000. Okay, but in 2019... ...and so it turns out it's always negative. Everything we computed, it's always negative and it seems to be growing pretty fast. And then Zagie computed it for n less than or equal to 100. And he sent us this page with these long, long numbers. They're all very large, getting very big, very fast, they're all negative, etc. But still we didn't really know exactly what was happening. We couldn't prove, for instance, that it's always negative. So now we can. The Euler characteristic of out of fn is negative. And it grows asymptotically the same. It grows like a gamma function, a factorial function. n minus 3 halves almost over, if I get this right, log squared n. And I think there's a square root of 2 pi in there somewhere too. Okay, so this is a gamma function that's like a factorial. So this grows almost as, almost factorially fast. The other thing about these Euler characteristics, where we walls Euler characteristics, is if you have an arithmetic group, it turns out that the Euler characteristics you get can be expressed as products of values of zeta functions. Yeah, so let me just say here, and there's a close relation with zeta functions. So, you know, this was known for arithmetic groups that there's this connection with zeta functions for a long time. And it made a big splash in the 1980s that the same thing is true for mapping class groups. That's a theorem of Herr and Zagier. That the rational characteristic of a mapping class group is a zeta function value. So it turns out out of fn has the same thing. Okay, I'm done advertising recent results. But the point is, yeah? You said that these Euler characteristics were rational? Rational numbers, yes. I start with a number with a, here's the definition. So by a special value of a zeta function, you mean after removing some pi? Well, it's a, yeah, it's a... It doesn't matter if they're all up. Yeah, yeah. So the point is that in order to prove this theorem, we looked at the action on this spine that I defined. So it's another use for the spine. What else can you do with the spine? Well, as a geometric group theorist, you might, you like the fact that the spine is quasi-isometric to the group. So if you want to compute quasi-isometry invariance of your group, you can use that space instead. Oh, yeah, I dropped the eraser, didn't I? Where were we, Euler characteristic? So qi invariance, qi invariance. So for example, what's a quasi-isometry invariant? How about the number of n's of a group? That's a quasi-isometry invariant. So what is that? If you look at the Cayley graph, or any space that's quasi-isometric to the group, then how many n's does it have? Well, you look at compact sets. You look at points outside the compact sets.  And there's either zero, if it's finite, or one, or two, or infinitely many, like if you have a free group. And Stallings proved that a finitely generated group has zero, one, two, or infinitely many n's. OK, so you can, so it's easy to see. Maybe it's even easier to see. So the spine is quasi-isometric to the group, but so is the mortification. So let's talk about that one for a while. So it's easy to see that this mortification, o n, has one end, if n's at least three. In other words, if I take two points, if I find a base point and I take two points that are very far away from it, I can connect them by a path that's very far away from it. That's what it means to have one end. Got two points that are far away, I can connect them by a path that stays far away. There's also a notion of higher connectivity, so this is called connected infinity if it's got one end. There's also a notion of higher connected, like simply connected at infinity. It's true that b o n is simply connected at infinity. So what does that mean? It means if I take a loop that's way far out here, way far away from the base point, then I can fill it in by a disk that stays way far away from the base point. That's what simply connected at infinity means. In fact, this mortification, o n, is two n minus five connected at infinity, and that's what Bestvena and Fein originally proved using the mortification. So this is a theorem of Bestvena and Fein. So far I'm just talking about the space, the space or the group. This actually has implications for the cohomology, too. So by work of Bieri and Ekman, I said what one connected at infinity means. If you have a loop that's far out, you can fill it with a disk. So you can imagine what n connected if I have a k connected means if I have a k sphere, I can fill it in with a three ball that stays far away. I mean, with a k sphere, I can fill it in with a k plus one ball. There you go. That stays far away. That's what two n minus, that's what k connected at infinity means. Okay, by work of Bieri and Ekman, this implies that the homology and cohomology of this group satisfy a kind of duality that's like Poincare duality, but not quite. So in Poincare duality you would have a duality between the k-th homology of some space, of some manifold, rather, and the d minus k-th homology of the manifold. Well, here we have, let me call this just an, an, and instead of isomorphic, yeah. So I'm going to get an isomorphism between homology and cohomology in the complementary dimension, but I have to, it's going to have twisted coefficients. Where d here, little d is two n minus three, and big d is the cohomology, the only non-vanishing cohomology of an with coefficient. Oops, this isn't true. Let's take a torsion free subgroup of finite index. This is true if I put in a torsion free subgroup. So there's some sort of a duality which is like the duality, Poincare duality, except that you have to add somehow the, the homology has coefficients twisted by some module, and the cohomology doesn't. Okay, so that's, so not only do you get information about the number of n's and how connected this, the, the group is that infinity, you get information about the cohomology as well. There's a duality. Right. What other quasi-isometry invariants do you know? You may know about Dain functions and isoparametric functions. In general, is anybody, so I guess Anna didn't really talk too much about Dain functions this morning, did she? No. So in other quasi-isometry invariants, the Dain function of a finitely presented group, G, well, it measures basically how many relations you need to apply. If you've got a word in the generators and it gives you the identity in the group, it measures how many relations you have to apply to prove that. So it turns out that up to some fuzziness, this is a, an invariant, a quasi-isometry invariant of the group. And it's, it's also thought of as, so if you're thinking about a word as a path in the Cayley graph, then it tells you how many relators you have to apply to check that that word is trivial, or in other words how many two cells you need in the Cayley complex to stick in to prove that this loop contracts. So it's an isomeric, it's a one-dimensional isoparametric function. So since this is a, which is a quasi-isometry invariant. So since it's a quasi-isometry invariant, you can calculate it if you have any space that's quasi-isometric to your group. So we have lots of spaces, two spaces at least that are quasi-isometric to our group. Let's do, see what I want to do, otter out. I don't think it matters. Just calculate the Dain function K and 0. So how do you do that? Well K and 0 is a simplicial complex. And we know exactly what the simplices are. So take a loop and what you have to do is define some sort of natural paths from all the points on the loop to one point. Any old paths will do, but it's good to have ones that fit together nicely. And if you choose the paths nicely, you can actually count how many triangles it takes. How many triangles it takes to fill them in? I don't need that one. Define paths count triangles. So that'll tell you how many triangles you need to fill in a loop. And so that'll give you an upper bound on the Dain function, which turns out to be exponential in the length of the loop. So that gives you an upper bound. You can get a lower bound. Oh yeah, I'm sorry, this was Alan Hatcher and myself in 2000 and something or other. I didn't write it down. And to get a lower bound, you can use a trick that people already knew a lower bound for GL3Z. It's exponential. And there's a map from out of F3 to GL3Z. Namely, you take a free group and you abelianize it, you get a free abelian group and that induces a map on automorphism groups and that gives this group. But we're not so interested in groups, we're more interested in spaces. So there's a nice space that GL3Z acts on called a symmetric space. And of course out of F3 acts on this K30. And the reason, the way they proved that GL3Z has an exponential Dain function is by finding loops in this space that are very hard to fill. So the trick is to take one of these loops that's hard to fill, to find a map from this space to this space, and lift the loops from this space back to this space. They can't be easy to fill over here because if they were easy to fill over here they'd push the filling down here and get a cheap filling here. But you can't. These loops are very hard to fill back here so they must be very hard to fill back here. So that's the idea. But that only works for n equals 3. And then for n bigger than 3 it turns out that you can use all three different ways of thinking about outer space to jack up the n equals 3 result to any n. And let me just say that without doing it to other descriptions of on to bootstrap to any n. So this bootstrapping was done first by Handel and Mosher, and later Martin Bridesen and I did another version. So that was in 2010. Okay, so we've got, I've told you how to compute co-homological invariance of your group, various quasi-isometry invariance. Oh yeah, one thing I wanted to say. So why is this space so good at figuring out things about out of fn? Here's another nice result. So I have an action of a, let's just take s equals 0 so I make sure I don't get any details wrong. a n acts on k n and it acts by simplicial automorphisms. I showed you that the action doesn't change the graphs at all. It just changes the markings. So any way you think about k n it doesn't really change the shapes of the simplices. It just changes kind of where they are. So that gives you a map from a n to the group of simplicial automorphisms of this spine. This works for any n and the theorem is that this is an isomorphism if n is at least 3. So that theorem is Martin Bridesen and myself. So one reason you can get so much juice out of these spines is that the whole group is encoded in the spine. The set of simplicial automorphisms of this spine is the group. And later Aramayona and Sutu proved that in fact so a n acts on the whole sphere complex and they proved that that's also an isomorphism. So you could use either the whole sphere complex which is a hyperbolic complex remember which some people like or you could use the spine and in either case those combinatorial objects encode the entire group. And I've got 9 minutes to tell you about the metric theory of outer space and I'm going to do it a little bit. So Indira objected to me on the very first day that I was describing a topological space instead of a metric space. Well yeah there isn't really a nice metric to put on outer space. You could for instance put a metric where all these simplices were regular Euclidean simplices. That's a fine metric. I don't think anybody can prove anything about that metric but it's a fine metric. But on the other hand there is another metric called the Lipschitz metric on outer space on ON. I don't think it's anybody studied it for ONS not that I know of. Anybody out there studying it for ONS? Yeah okay. So Lipschitz metric on ON. So the people that have done the work on this think of use the graph model. So what's the Lipschitz metric? First of all remind you what the Lipschitz constants of a map is. If x and y are compact metric spaces and you've got a map from x to y then the Lipschitz constant of f is, I've got compact sets so I can say the max of over pairs x, x prime and x. The distance between f of x and f of x prime divided by the distance between x and x prime. So it's how the maximum amount distances could get stretched by this map. Compact metric spaces. So now how do I define, supposing I have two points. So let me draw them like this. Here's g. Here's g prime. I've got two maps from the rows to g. And I wanted to find a distance between those two points in outer space. So let me call this x, call this x prime. The distance between x and x prime is going to be, it turns out I can say, well let's just say inf of the Lipschitz maps. The Lipschitz constants of maps f and what are these maps f? They're maps f that I can put here. In other words f composed with g is homotopic to g prime. So that's the definition of the distance between two points between x and x prime. It's not too hard to check. It satisfies the triangle inequality. And it satisfies the distance between x and x prime is zero. It implies that x and x prime are the same point. But does not satisfy the distance between x and x prime is equal to the distance between x prime and x. So it's a kind of a funny metric. This is really easy to see. Let's take two points in outer space. One is just a rose, marked like that. And here's another point, same marking. Whoops, b. A is tiny and b is big. So the mapping here is the identity. So I want to map here that minimizes, let me try it this way first. Minimizes the stretch. Well b might have to stretch to almost twice its length. But that's as far as it has to go. So this is x and this is x prime. The distance between x and x prime is less than two. On the other hand, what happens if you try to measure the distance between x prime and x? Well, this tiny little loop here, it's just got length epsilon, has to get stretched all the way up to a half. So it's at least one over two epsilon, where this has length epsilon. So the distance between these two points is different if you go in different directions. Well, that should be not equal to the distance between x and x prime. No, if the distance is zero, then the points are the same. No, below the distance between x and x. Oh, yes. Thank you. Yes. Okay, so what am I going to say about this? Only one thing that Bestvena used this metric to prove a really nice theorem. You could always symmetrize the metric. Yes, you can, but then you can't. You lose geodesics. You lose, yeah, it's not complete, it's geodesically complete anymore. So with this thing, it is geodesically complete. But if you symmetrize, it's not. That's an interesting feature. Right, Bestvena, let me tell you what Bestvena did. Well, he did many things with this metric, but one thing he did it is used this metric to find nice representative G to G of an automorphism to Fn. So he showed how to identify the fundamental group with G, that's by a marking. Same marking on both sides. And so you've got an automorphism of the free group and he showed how to lift that to a really nice map of here called a train track map. He actually, his proof only does it if V is what's called fully irreducible. And I don't think anybody's really written. So you can find, yeah, this is a very nice proof of a result originally due to Bestvena and Handel. It's the beginning of a long story about how to study automorphisms of free groups. If you have a single automorphism, if you can find a nice representative, you can figure out lots of things about that automorphism. And yeah, it's five o'clock. They've proved many, many things about single automorphisms and groups of automorphisms and subgroups of automorphisms using train track maps and various improved, no, relative train track maps, improved train track maps, improved relative train track maps, completely split relative train track maps, et cetera, et cetera. So they keep getting better and better representatives for automorphisms and proving more and more theorems about the space. So I think I'm going to stop.